Автор | Сообщение |
|
| |
Пост N: 17
Зарегистрирован: 05.07.14
|
|
Отправлено: 25.07.14 21:03. Заголовок: Какие существуют библиотеки и функции для работы с файловой системой
Коллеги! Просветите серость о наличии библиотек и функций для работы с файловой системой. Я знаю функции adir(), directory(), но их функциональность сильно ограничена. Если такие библиотеки и функции существуют, то как их можно найти. И вообще где и как осуществляется поиск необходимого софта. Заранее признателен
|
|
|
Ответов - 24
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 4106
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.07.14 21:33. Заголовок: evgeny2006 пишет: Я..
evgeny2006 пишет: цитата: | Я знаю функции adir(), directory(), но их функциональность сильно ограничена |
| Чем ограничена ? Пример покажи. evgeny2006 пишет: цитата: | Если такие библиотеки и функции существуют, то как их можно найти |
| Поиском по тексту по сырцам Harbour
|
|
|
|
| |
Пост N: 18
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 08:44. Заголовок: Dima пишет: Чем огр..
Dima пишет: цитата: | Чем ограничена ? Пример покажи. |
| Мне, например, требуется создать список (структуру) некоторой папки, имеющей достаточно глубокую вложенность. Обращаю внимание, что требуется не список файлов, а именно список папок, вложенных друг в друга. При этом хотелось бы знать дату последнего обновления папки. Directory(), adir() - просто выдают список файлов в папке, при этом имеющиеся в папке другие папки не выдаются! цитата: | Поиском по тексту по сырцам Harbour |
| А аннотации или краткие описания где-нибудь существуют?
|
|
|
|
| |
Пост N: 19
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 08:58. Заголовок: Dima пишет: Поиском..
Dima пишет: цитата: | Поиском по тексту по сырцам Harbour |
| Вопрос не совсем праздный! Если где-то можно достаточно быстро найти что-то похожее, что тебе нужно, то имеет смысл поискать! Если же необходимо копаться, без уверенности, что найдешь то, что нужно, то имеет смысл взять и написать самому
|
|
|
|
| |
Пост N: 4107
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.07.14 09:42. Заголовок: Directory() - Запол..
Directory() - Заполнение массива информацией о файлах по указанному пути. Синтаксис Directory( [<cDirectory>], [<cAttribute>] ) --> aDirectory Параметры <cDirectory> <cDirectory> - символьная строка, которая указывает диск, каталог и файл. Полученная информация считывается в массив. Можно определить маску файла, подставив символы * или ?. Если параметр <cDirectory> не определен, используется *.*. При такой маске считывается вся информация о файлах текущего пути. <cAttribute> Этот дополнительный атрибут расширяет информацию о файле, помещенном в массив. <cAttribute> состоит из одного и более следующих символов: "D","H","S","V". Ниже представлены правильные значения для <cAttribute>: Атрибут Значение Действие -------------------------------------------------------------- D Directory В массив включаются имена каталогов H Hidden В массив включаются скрытые файлы S System В массив включаются системные файлы V Volume В массив включается имя диска, игнорируя файлы Возвращаемое значение функции Возвращаемое значение Directory() состоит из двумерного массива, в котором каждый элемент является подмассивом, содержащем информацию об очередном файле, выбранном в соответствии с аргументом <cDirectory>. Колонки массива могут быть установлены символическими константами, определенными в файле Directry.ch. Содержимое каждой колонки массива предоставлено в следующем таблице: Константа Cодержимое Тип данных -------------------------------------------------------------- F_NAME имя файла C F_SIZE размер файла N F_DATE дата последнего изменения D F_TIME время последнего изменения C F_ATTR атрибут файла C (скрытый, системный...) Если в <cDirectory> указан не правильный путь или спецификация файла, или вообще не найдено никаких соответствующих файлов, возвращается пустой массив. Описание Функция управления окружающей средой Directory() предоставляют информацию обо всех или выбранных файлах по указанному пути. #include: Directry.ch Смотрите также: AEval(), FClose() ПРИМЕР-1: // Directory() // В примере определяется количество байт, // занимаемых файлами DBF в текущем каталоге. #include "Directry.ch" PROCEDURE Main LOCAL aDbfFiles := Directory("*.DBF") LOCAL nCount := Len(aDbfFiles) LOCAL n, nSum nSum := 0 FOR n:= 1 TO nCount nSum += aDbfFiles[ n, F_SIZE ] NEXT ? nCount, "DBF файлы знаимают", nSum, "байт" RETURN ------------------------------------------------------- ПРИМЕР-2: // В примере все PRG файлы сортируются по имени файла, // а вся полученная о них информация заносится в файл вывода. PROCEDURE Main LOCAL aPrgFiles := Directory("*.PRG") // сортировка массива по имени ASort( aPrgFiles,,, {|a1,a2| a1[ F_NAME ] < a2[ F_NAME ] } ) // вывод данных на принтер и параллельно в файл SET PRINTER TO Prglist.txt SET PRINTER ON // вывод массива AEval( aPrgFiles, ; {|a| QOut( PadR( a[ F_NAME ], 30 ) , ; a[ F_SIZE ] , ; a[ F_DATE ] , ; a[ F_TIME ] , ; a[ F_ATTR ] ) } ) SET PRINTER TO SET PRINTER OFF RETURN
|
|
|
|
| |
Пост N: 20
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 11:01. Заголовок: Dima пишет: Direct..
Dima пишет: цитата: | Directory() - Заполнение массива информацией о файлах по указанному пути |
| Спасибо за ответ, но я так и делал. Я взял пример FillDirList, добавил несколько строк, выводящих сообщения о значениях параметров F_SIZE, F_DATE и стал его тестировать. Выводится список имен файлов. Список папок - не выводится. Параметры F_SIZE, F_DATE - пустые. Стал копать дальше, набрел на функцию FileDate(), но найти способ получить перечень папок не смог. Отсюда вопрос и возник! Запускал программу в двух вариантах: aDirList := Directory( cDIRName ) и aDirList := Directory( cDIRName,"D" ) но результат - одинаков
|
|
|
|
| |
Пост N: 259
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.07.14 12:02. Заголовок: evgeny2006 пишет: н..
evgeny2006 пишет: цитата: | но найти способ получить перечень папок не смог. |
| #include "Directory.ch" FUNC Main() aDirectory := DIRECTORY("*.*", "D") AEVAL( aDirectory, { |aFile| IF( aFile[F_ATTR] == "D", QOUT( aFile[F_NAME] + " - " + DTOC(aFile[F_DATE]) ), NIL )} ) RETURN NIL Вложенные папки искать рекурсией PS видимо следует начать с изучения основ языка. В папке harbour из поставки есть файл справки
|
|
|
|
| |
Пост N: 21
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 13:56. Заголовок: Haz пишет: PS видим..
Haz пишет: цитата: | PS видимо следует начать с изучения основ языка. В папке harbour из поставки есть файл справки |
| Это всего лишь help, а не осровы языка Спасибо за ответ
|
|
|
|
| |
Пост N: 22
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 14:05. Заголовок: Haz пишет: Вложенны..
Haz пишет: цитата: | Вложенные папки искать рекурсией |
| Для этого надо хотя бы найти папку
|
|
|
|
| |
Пост N: 306
Зарегистрирован: 16.12.08
|
|
Отправлено: 26.07.14 14:33. Заголовок: evgeny2006 пишет: Д..
evgeny2006 пишет: цитата: | Для этого надо хотя бы найти папку |
| Евгений. Я работал с Фоксом начиная с Foxbase более 20 лет, проблем с переходом на (x)Harbour проблем не возникает никаких если знаете язык xBase и C. Я бы на вашем месте скачал файл помощи для xHarbour , там есть полный список всех функций, процедур для работы с файловой системой и не только. Все функции практически идентичны с Harbour. Если например нужно помощь по самому языку, то есть файл помощи на русском языке по внутреннему языку системы Бест 5. Всё можна скачать здесь : http://code.google.com/p/santysoft/downloads/list Если хотите класы для работы с файловой системой, нужно идти на форумы : pctoledo, hmg, fivewin, xailer, xHarbour.com и там искать. Есть много всяких вариантов в библиотеке Григория Филатова minigui, или Александра Кресина HWGUI(http://sourceforge.net/projects/hwgui/), oohg (http://sourceforge.net/projects/oohg/). Вариантов много.
|
|
|
|
| |
Пост N: 23
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 14:36. Заголовок: Haz пишет: #include..
Haz пишет: За участие - большое спасибо! В #include библиотека указана с ошибкой. Я выполнил пример, приведенный Вами, но результат тот же самый! Т.е. функция directory() работает неправильно!!! Она не определяет ни директории, ни параметры F_DATE. Кстати, забыл упомянуть, что я работаю на Windows 7. Я снова возвращаюсь к первоначальному вопросу:"Существуют ли дополнительные библиотеки или функции для работы с файловой системой."
|
|
|
|
| |
Пост N: 4108
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.07.14 14:48. Заголовок: evgeny2006 пишет: В..
evgeny2006 пишет: цитата: | В #include библиотека указана с ошибкой |
| надо directry.ch ЗЫ Пример рабочий , Windows XP SP3
|
|
|
|
|
| |
Пост N: 24
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 14:53. Заголовок: santy пишет: Я рабо..
santy пишет: цитата: | Я работал с Фоксом начиная с Foxbase более 20 лет |
| Я примерно как двадцать лет назад написал последнюю программу на Клиппер, хотя более менее ориентируюсь в функциях языка, и вопрос поднял в связи с неработоспособностью конкретной функции. Вообще мой стаж программирования приближается к 50 годам, хотя последние 20 лет я провел на административных должностях. При этом не утратил интерес к программированию. Правда львиная доля задач была связана с численными методами. Большое спасибо за участие!!!
|
|
|
|
| |
Пост N: 25
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 15:38. Заголовок: santy пишет: Если н..
santy пишет: Я уже попадал на этот сайт и что-то даже брал отсюда. Но уж очень поспешно. Я недооценил этот сайт! Зашел повторно. Создал закладку на всякий случай. Вопрос. Приводятся ссылки на Борланд 5.82 . Я уже успел почитать, что он платный. Есть ли какие-либо преимушества от его использование? Большое спасибо за добротную ссылку!!!
|
|
|
|
| |
Пост N: 26
Зарегистрирован: 05.07.14
|
|
Отправлено: 26.07.14 15:49. Заголовок: Dima пишет: Пример ..
Dima пишет: цитата: | Пример рабочий , Windows XP SP3 |
| Возможно, что пример и рабочий. Никто не мешает взять и переименовать библиотеку. Я привожу название программы из комплекта поставки (папка FillDirList). которую я использовал для проверки работоспособности функции directory(). Разве трудно взять этот пример один к одному и прогнать его. Вы тогда убедитесь в неработоспособности этой фукции. В любом случае, большое спасибо, что откликнулись.
|
|
|
|
| |
Пост N: 4109
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.07.14 15:57. Заголовок: evgeny2006 пишет: Я..
evgeny2006 пишет: цитата: | Я привожу название программы из комплекта поставки (папка FillDirList) |
| Это из Минигуи ? Да есть такая. Проверил. Работает нормально.
|
|
|
|
| |
Пост N: 260
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.07.14 17:54. Заголовок: evgeny2006 пишет: Я..
evgeny2006 пишет: цитата: | Я взял пример FillDirList, добавил несколько строк, выводящих сообщения о значениях параметров F_SIZE, F_DATE и стал его |
| может все дело в этих строчках ??? без них FillDirList работает в соответствии с его кодом. Скиньте свой простой неработающий пример,все его посмотрят а то мы тут телепатией занимаемся.
|
|
|
|
| |
Пост N: 27
Зарегистрирован: 05.07.14
|
|
Отправлено: 27.07.14 08:48. Заголовок: Haz пишет: Скиньте ..
Haz пишет: цитата: | Скиньте свой простой неработающий пример,все его посмотрят а то мы тут телепатией занимаемся. |
| Привожу текст примера, в который вставлен и Ваш код, только закомментированный. Поскольку все выполняется в цикле, желательно создать тестовую папку с вложенными папками. Это только один из вариантов примера. Скрытый текст /* HMG Fill Directory List Demo (c) 2011 Bicahi Esgici */ #include "minigui.ch" #Include "Directry.CH" PROCEDURE MAIN() SET LANGUAGE TO RUSSIAN DEFINE WINDOW frmTestDirList; AT 0, 0; WIDTH 500 ; HEIGHT 500 ; TITLE "Test DIR List" ; MAIN ; ON INIT FillDirList(.t.) ON KEY ESCAPE ACTION ThisWindow.Release @ 10, 100 BUTTON btnReLoad CAPTION "Re-Load" ACTION FillDirList() @ 100, 100 LISTBOX lstbxDirList WIDTH 300 HEIGHT 300 SORT END WINDOW // frmTestDirList frmTestDirList.Center frmTestDirList.Activate RETURN // MAIN() *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCEDURE FillDirList(lInit) LOCAL cDIRName := GetFolder( "Choose a folder" ) LOCAL curDIR LOCAL aDirList AS ARRAY LOCAL nDirElemNo local d_date local c_date LOCAL cFileName DEFAULT lInit := .f. curDIR=cDIRName+"\" msgbox(cDIRName,'Current Foulder') IF !EMPTY( cDIRName ) cDIRName += "\*.*" cDIRName := STRTRAN( cDIRName, "\\", "\" ) aDirList := Directory( cDIRName ) //aDirectory := DIRECTORY("*.*", "D") //AEVAL( aDirectory, { |aFile| IF( aFile[F_ATTR] == "D", QOUT( aFile[F_NAME] + " - " + DTOC(aFile[F_DATE]) ), NIL )} ) AEVAL( aDirList, { |aFile| IF( aFile[F_ATTR] == "D", msgbox( aFile[F_NAME] + " - " + DTOC(aFile[F_DATE]) ), NIL )} ) IF EMPTY( aDirList ) MsgInfo( cDIRName + CRLF + " This folder doesn't contains ordinary file.") ELSE IF !lInit frmTestDirList.lstbxDirList.DeleteAllItems() ENDIF !lInit FOR nDirElemNo := 1 to LEN( aDirList ) cFileName=curDIR+aDirList[ nDirElemNo, 1 ] msgbox(cFileName,'Bookname') //cFileName := FileSeek(cFileName) d_date=FileDate(cFileName) c_date=DtoS( d_Date ) MsgBox( c_date , "Date" ) frmTestDirList.lstbxDirList.AddItem( aDirList[ nDirElemNo, 1 ] ) NEXT ENDIF EMPTY( aDirList ) ENDIF !EMPTY( cDIRName ) RETURN // FillDirList()
|
|
|
|
|
| |
Пост N: 261
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.07.14 09:13. Заголовок: evgeny2006 пишет: Э..
evgeny2006 пишет: цитата: | Это только один из вариантов примера |
| опять повторюсь - Ваш пример работает ПРАВИЛЬНО и по той логике которую вы туда вложили - работа ТОЛЬКО по выбранной папке БЕЗ включения в массив имен вложенных папок и БЕЗ их сканирования!!!!!!!!!!! Советую посмотреть из пример Samples\Advanced\Fileman из поставки минигуи, от основан на использовании функции Directory() а потом убеждать всех что функция не работает
|
|
|
|
| |
Пост N: 30
Зарегистрирован: 05.07.14
|
|
Отправлено: 27.07.14 11:11. Заголовок: Haz пишет: работа Т..
Haz пишет: цитата: | работа ТОЛЬКО по выбранной папке БЕЗ включения в массив имен вложенных папок и БЕЗ их сканирования |
| Насчет сканирования Вы правы. Я не ставил на данном этапе сканирование вложенных папок. Мне нужно было определиться - есть вложенная папка или нет. В пример включена предложенная Вами команда анализа на наличие директория AEVAL( aDirList, { |aFile| IF( aFile[F_ATTR] == "D", msgbox( aFile[F_NAME] + " - " + DTOC(aFile[F_DATE]) ), NIL )} ) У меня в исходной папке имеются еще три вложенные папки, но они не индетифицируются!!! Судя по Вашему комментарию (со многими восклицательными знаками), собака зарыта в команде cDIRName += "\*.*" После того, как Вам отвечу - обязательно проверю! Если это так, как Вы говорите, буду посыпать голову пеплом и каяться во всех грехах. Это кстати связано с тем, как пишутся книги. Haz пишет: цитата: | Советую посмотреть из пример Samples\Advanced\Fileman |
| За совет - спасибо! Что касается убеждения - то это не совсем так. Я просто хотел предупредить тех, кто с этим столкнется, о наличии проблемы. Кстата, я этого достиг и в описание функции следует внести необходимые изменения. Большое спасибо за Вашу помощь111
|
|
|
|
| |
Пост N: 262
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.07.14 11:47. Заголовок: не надо голову ничем..
не надо голову ничем посыпать. Давайте просто зафиксируем что функция Directory() работает как ей и положено, а это значит что она принимает точку входа и атрибуты которые учитываются при заполнении массива и возвращает заполненный массив. При этом если атрибуты явно не указаны - то в массив попадут только обычные файлы ( т.е. не папки , не скрытые или системные, не метки тома и пр ) именно так и поступает пример FillDirList. Если ваша задача просканировать папки с волженными и получить дату создания то вот простой код. #include "Directry.ch" // FUNC Main() LOCAL cCurDir := "C:\" SETCANCEL(.T.) // ALT-C DirScan( cCurDir ) RETURN NIL FUNC DirScan( cDir ) LOCAL aDirectory := DIRECTORY(cDir + "*.*" , "D") LOCAL cCurDir := "" LOCAL i := 0 FOR i := 1 TO LEN( aDirectory) IF !("." $ aDirectory[F_NAME] ) IF aDirectory[F_ATTR] == "D" cCurDir := SUBSTR(cDir, 1, RAT("\", cDir)+1) + aDirectory[F_NAME] + "\" ? PADR( cCurDir, 50, " "), " Created date:", aDirectory[F_DATE] DirScan( cCurDir ) inkey(0.01) END END END RETURN NIL
|
|
|
Ответов - 24
, стр:
1
2
All
[только новые]
|
|