Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.5. Низкоуровневая работа с файлами и папками в kol

Так как KOL разрабатывался для создания проектов прежде всего для среды Windows, а наиболее эффективный способ работы с файлами в этой среде - это работа напрямую с соответствующими функциями API Windows, то для KOL создан ряд функций для работы с файлами именно на этом уровне. Я не рекомендую использовать функции Паскаля (Append, Rewrite, Reset, ...), хотя бы и претендующие на некую платформенную независимость, ввиду определенной ограниченности их возможностей. Кроме того, они добавят к приложению несколько килобайт совершенно бесполезного кода. В то же время, работа с функциями API Windows напрямую несколько неудобна, ввиду слишком большого числа параметров, которые надо почти все указывать. По моему мнению, удобнее работать с функциями KOL:

FileCreate( s, flags ) - создает или открывает файл на чтение или на запись, в зависимости от флажков (например, ofOpenRead or ofOpenExisting or ofShareDenyWrite - открывает существующий файл на чтение, запрещая запись в этот файл до закрытия созданного дескриптора. Имеются следующие флажки (которые надо конкатенировать операцией or):

- группа метода доступа - требуется выбрать только один флаг:

ofOpenRead, ofOpenWrite, ofOpenReadWrite;

- группа способа создания или открытия существующего файла - так же должен быть выбран только один флаг:

ofOpenExisting, ofOpenAlways, ofCreateNew, ofTruncateExisting;

- (необязательная) группа разделения доступа:

ofShareDenyWrite, ofShareDenyRead, ofShareDenyNone;

- и, наконец, группа атрибутов создания файла, которые можно (но необязательно) добавить к флажкам при создании файла:

ofAttrReadOnly, ofAttrHidden, ofattrSystem, ofAttrTemp, ofAttrArchive, ofAttrOffline;

Результат вызова функции FileCreate - это дескриптор типа hFile (просто беззнаковое 32-разрядное число), который используется в прочих файловых функциях для идентификации открытого файлового объекта. Используя этот же дескриптор, возможно так же вызывать и функции API для работы с файлами.

FileClose( f ) - закрывает файл;

FileExists( s ) - проверяет наличие файла по заданному пути;

FileRead( f, buffer, n ) - читает байты из файла в память;

FileWrite( f, buffer, n ) - пишет байты из памяти в файл;

FileEOF( f ) - проверяет, достигнут ли конец файла (при чтении);

FileSeek( f, moveto, movemethod ) - перемещает указатель чтения/записи в файле;

File2Str( f ) - читает остаток файла как строку.

Кроме этого, имеется ряд функций для выполнения открытия, чтения или записи, и закрытия файла - за один вызов (и другие функции для работы с файлом по имени, без создания дескриптора в программе):

StrSaveToFile( fname, s ) - создает или перезаписывает файл из строки s в оперативной памяти;

StrLoadFromFile( fname ) - читает весь файл в строку;

Mem2File( fname, mem, n ) - записывает участок памяти в файл;

File2Mem( fname, mem, n ) - читает весь файл в буфер в памяти;

FileTimeCompare( fname1, fname2 ) - сравнивает время последней модификации двух файлов и возвращает, в зависимости от результатов, -1, 0 или 1;

FileSize( fname ) - возвращает размер файла (64-разрядное целое);

ChangeFileExt( fname, ext ) - изменяет расширение указанного файла.

Так же, имеется некоторое количество функций для работы с директориями (папками), именами директорий и временных файлов, и с дисками:

GetStartDir - возвращает путь к директории, в которой стартовало приложение (рекомендую использовать именно эту функцию, а не GetWorkDir),

DirectoryExists( s ) - проверяет наличие директории;

DirectoryEmpty( s ) - проверяет наличие файлов (и вложенных директорий) в указанной директории (true возвращается, если директория пуста, в соответствии с названием функции);

DirectoryHasSubdirs( s ) - проверяет наличие вложенных поддиректорий в заданной директории;

CheckDirectoryContent( s, subdirsonly, mask ) - проверяет наличие заданных маской файлов и поддиректорий;

CreateDir( s ) - создает директорию;

ForceDirectories( s ) - создает директорию, обеспечивая, при необходимости, создание всех вышележащих директорий, заданных в пути s;

IncludeTrailingPathDelimiter( s ) - возвращает путь s, добавляет при необходимости разделитель пути (символ '\'). Вообще-то большинство функций KOL, возвращающих путь к директории, обеспечивают наличие завершающего символа слеша ('\'), но иногда имя директории может быть получено другим способом (например, в результате ручного ввода пути пользователем в окне редактирования;

ExcludeTrailingPathDelimiter( s ) - в противоположность предыдущей функции, отбрасывает завершающий обратный слеш;

FilePathShortened( s, n ) - форматирует путь к файлу, укорачивая его до максимум n символов (промежуточные директории из середины выбрасываются, и заменяются многоточием '...');

FilePathShortenPixels( s, DC, n ) - аналогично предыдущей функции, но длина текстового представления пути "вписывается" в размер n пикселей на канве DC;

ExtractFilePath( s ) - извлекает только путь к директории файла;

ExtractFileName( s ) - извлекает имя файла с расширением;

ExtractFileNameWOExt( s ) - извлекает имя файла без расширения;

ExtractFileExt( s ) - извлекает только расширение (первым символом в строке результата будет '.', кроме случая пустого расширения);

GetSystemDir - возвращает путь к системной директории Windows (Windows\System32 или другая, в зависимости от версии Windows);

GetWindowsDir - возвращает путь к директории самой Windows;

GetWorkDir - возвращает путь к "рабочей" директории;

GetTempDir - возвращает путь к директории, предназначенной для хранения временных файлов (свои временные файлы лучше всего создавать именно в ней);

CreateTempFile( s, s1 ) - возвращает строку, которую можно использовать в качестве имени временного файла (заметьте, что сам файл она не создает);

GetFileListStr( s ) - возвращает строку, содержащую перечень (через символ с кодом #13) всех файлов в указанной директории;

DeleteFile2Recycle( s ) - удаляет указанный файл (или список файлов, перечисленных с разделителем #13) в корзину (в отличие от функции API DeleteFile( s ));

DeleteFiles( s ) - удаляет файлы по маске (как обычно, разрешаются символы '*' и '?' при задании шаблона маски;

CopyMoveFiles( s1, s2, move ) - копирует или перемещает указанные (списком, через символ #13, символы шаблонов так же допускаются) файлы в заданную директорию;

DiskFreeSpace( s ) - возвращает число свободных байтов на диске (результат типа I64);

DirectorySize( s ) - возвращает размер директории (вместе со всеми поддиректориями, результат так же типа I64).

Помимо функций доступа к файлам на низком уровне, KOL так же содержит средства для работы с потоками данных (streams), но об этом позже (поскольку потоки - это уже объекты, а сейчас я пока объекты не затрагиваю).