Форум » [x]Harbour » Какие существуют библиотеки и функции для работы с файловой системой » Ответить

Какие существуют библиотеки и функции для работы с файловой системой

evgeny2006: Коллеги! Просветите серость о наличии библиотек и функций для работы с файловой системой. Я знаю функции adir(), directory(), но их функциональность сильно ограничена. Если такие библиотеки и функции существуют, то как их можно найти. И вообще где и как осуществляется поиск необходимого софта. Заранее признателен

Ответов - 24, стр: 1 2 All

Dima: evgeny2006 пишет: Я знаю функции adir(), directory(), но их функциональность сильно ограничена Чем ограничена ? Пример покажи. evgeny2006 пишет: Если такие библиотеки и функции существуют, то как их можно найти Поиском по тексту по сырцам Harbour

evgeny2006: Dima пишет: Чем ограничена ? Пример покажи. Мне, например, требуется создать список (структуру) некоторой папки, имеющей достаточно глубокую вложенность. Обращаю внимание, что требуется не список файлов, а именно список папок, вложенных друг в друга. При этом хотелось бы знать дату последнего обновления папки. Directory(), adir() - просто выдают список файлов в папке, при этом имеющиеся в папке другие папки не выдаются! Поиском по тексту по сырцам Harbour А аннотации или краткие описания где-нибудь существуют?

evgeny2006: Dima пишет: Поиском по тексту по сырцам Harbour Вопрос не совсем праздный! Если где-то можно достаточно быстро найти что-то похожее, что тебе нужно, то имеет смысл поискать! Если же необходимо копаться, без уверенности, что найдешь то, что нужно, то имеет смысл взять и написать самому


Dima: [pre2] 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 [/pre2]

evgeny2006: Dima пишет: Directory() - Заполнение массива информацией о файлах по указанному пути Спасибо за ответ, но я так и делал. Я взял пример FillDirList, добавил несколько строк, выводящих сообщения о значениях параметров F_SIZE, F_DATE и стал его тестировать. Выводится список имен файлов. Список папок - не выводится. Параметры F_SIZE, F_DATE - пустые. Стал копать дальше, набрел на функцию FileDate(), но найти способ получить перечень папок не смог. Отсюда вопрос и возник! Запускал программу в двух вариантах: aDirList := Directory( cDIRName ) и aDirList := Directory( cDIRName,"D" ) но результат - одинаков

Haz: 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 из поставки есть файл справки

evgeny2006: Haz пишет: PS видимо следует начать с изучения основ языка. В папке harbour из поставки есть файл справки Это всего лишь help, а не осровы языка Спасибо за ответ

evgeny2006: Haz пишет: Вложенные папки искать рекурсией Для этого надо хотя бы найти папку

santy: 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/). Вариантов много.

evgeny2006: Haz пишет: #include "Directory.ch" За участие - большое спасибо! В #include библиотека указана с ошибкой. Я выполнил пример, приведенный Вами, но результат тот же самый! Т.е. функция directory() работает неправильно!!! Она не определяет ни директории, ни параметры F_DATE. Кстати, забыл упомянуть, что я работаю на Windows 7. Я снова возвращаюсь к первоначальному вопросу:"Существуют ли дополнительные библиотеки или функции для работы с файловой системой."

Dima: evgeny2006 пишет: В #include библиотека указана с ошибкой надо directry.ch ЗЫ Пример рабочий , Windows XP SP3

evgeny2006: santy пишет: Я работал с Фоксом начиная с Foxbase более 20 лет Я примерно как двадцать лет назад написал последнюю программу на Клиппер, хотя более менее ориентируюсь в функциях языка, и вопрос поднял в связи с неработоспособностью конкретной функции. Вообще мой стаж программирования приближается к 50 годам, хотя последние 20 лет я провел на административных должностях. При этом не утратил интерес к программированию. Правда львиная доля задач была связана с численными методами. Большое спасибо за участие!!!

evgeny2006: santy пишет: Если например нужно помощь по самому языку, то есть файл помощи на русском языке по внутреннему языку системы Бест 5. Всё можна скачать здесь : http://code.google.com/p/santysoft/downloads/list Я уже попадал на этот сайт и что-то даже брал отсюда. Но уж очень поспешно. Я недооценил этот сайт! Зашел повторно. Создал закладку на всякий случай. Вопрос. Приводятся ссылки на Борланд 5.82 . Я уже успел почитать, что он платный. Есть ли какие-либо преимушества от его использование? Большое спасибо за добротную ссылку!!!

evgeny2006: Dima пишет: Пример рабочий , Windows XP SP3 Возможно, что пример и рабочий. Никто не мешает взять и переименовать библиотеку. Я привожу название программы из комплекта поставки (папка FillDirList). которую я использовал для проверки работоспособности функции directory(). Разве трудно взять этот пример один к одному и прогнать его. Вы тогда убедитесь в неработоспособности этой фукции. В любом случае, большое спасибо, что откликнулись.

Dima: evgeny2006 пишет: Я привожу название программы из комплекта поставки (папка FillDirList) Это из Минигуи ? Да есть такая. Проверил. Работает нормально.

Haz: evgeny2006 пишет: Я взял пример FillDirList, добавил несколько строк, выводящих сообщения о значениях параметров F_SIZE, F_DATE и стал его может все дело в этих строчках ??? без них FillDirList работает в соответствии с его кодом. Скиньте свой простой неработающий пример,все его посмотрят а то мы тут телепатией занимаемся.

evgeny2006: 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()

Haz: evgeny2006 пишет: Это только один из вариантов примера опять повторюсь - Ваш пример работает ПРАВИЛЬНО и по той логике которую вы туда вложили - работа ТОЛЬКО по выбранной папке БЕЗ включения в массив имен вложенных папок и БЕЗ их сканирования!!!!!!!!!!! Советую посмотреть из пример Samples\Advanced\Fileman из поставки минигуи, от основан на использовании функции Directory() а потом убеждать всех что функция не работает

evgeny2006: Haz пишет: работа ТОЛЬКО по выбранной папке БЕЗ включения в массив имен вложенных папок и БЕЗ их сканирования Насчет сканирования Вы правы. Я не ставил на данном этапе сканирование вложенных папок. Мне нужно было определиться - есть вложенная папка или нет. В пример включена предложенная Вами команда анализа на наличие директория AEVAL( aDirList, { |aFile| IF( aFile[F_ATTR] == "D", msgbox( aFile[F_NAME] + " - " + DTOC(aFile[F_DATE]) ), NIL )} ) У меня в исходной папке имеются еще три вложенные папки, но они не индетифицируются!!! Судя по Вашему комментарию (со многими восклицательными знаками), собака зарыта в команде cDIRName += "\*.*" После того, как Вам отвечу - обязательно проверю! Если это так, как Вы говорите, буду посыпать голову пеплом и каяться во всех грехах. Это кстати связано с тем, как пишутся книги. Haz пишет: Советую посмотреть из пример Samples\Advanced\Fileman За совет - спасибо! Что касается убеждения - то это не совсем так. Я просто хотел предупредить тех, кто с этим столкнется, о наличии проблемы. Кстата, я этого достиг и в описание функции следует внести необходимые изменения. Большое спасибо за Вашу помощь111

Haz: не надо голову ничем посыпать. Давайте просто зафиксируем что функция 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



полная версия страницы