Типы, функции и процедуры Delphi для работы с файлами.
Содержание:
Процедуры и функции для работы с файлами.
Тип TSearchRec.
Тип TWin32FindData.
Процедуры и функции для работы с файлами
Ниже приведена таблица, содержащая стандартные процедуры и функции Delphi7 для работы с файлами и их краткое описание. Функции в таблице расположены в алфавитном порядке.
Наименование | Тип модуль | Описание | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AssignFile | процедура System |
|||||||||||||||||||||||||||||||||||||||
ChDir | процедура System |
|||||||||||||||||||||||||||||||||||||||
CloseFile | процедура System |
|||||||||||||||||||||||||||||||||||||||
CreateDir | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
DeleteFile | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
DirectoryExists | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
DiskFree | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
DiskSize | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
File mode | константы System | Используются для открытия и закрытия дисковых файлов.
const fmClosed = $D7B0; // closed file Эти константы используются в первую очередь в Delphi коде, где поле Mode в TFileRec и TTextRec содержит одно из этих значений. | ||||||||||||||||||||||||||||||||||||||
File open mode | константы SysUtils | Константы режима открытия файла используются для контроля режима доступа к файлу или потоку.
Для Windows:Эти константы используются для конроля режима совместного доступа при открытии файла или потока. TFileStream конструктор имеет параметр Mode в котрый вы можете прописать одну из следующих констант:
| ||||||||||||||||||||||||||||||||||||||
FileAccessRights | пременная | Points to the command-line arguments specified when the application is invoked. Только для Linux. В Windows эта переменная игнорируется. | ||||||||||||||||||||||||||||||||||||||
FileAge | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileClose | процедура SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileCreate | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileDateToDateTime | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileExists | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileGetAttr | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileGetDate | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileIsReadOnly | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileOpen | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileRead | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileSearch | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileSeek | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileSetAttr | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileSetDate | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileSetReadOnly | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FileWrite | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FindClose | процедура SysUtils |
|||||||||||||||||||||||||||||||||||||||
FindFirst | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
FindNext | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
ForceDirectories | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
GetCurrentDir | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
GetDir | процедура System |
|||||||||||||||||||||||||||||||||||||||
RemoveDir | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
RenameFile | функция SysUtils |
|||||||||||||||||||||||||||||||||||||||
SetCurrentDir | функция SysUtils |
Константа | Значение | Описание |
---|---|---|
faReadOnly | 1 | Файлы Только для чтения |
faHidden | 2 | Скрытые файлы |
faSysFile | 4 | Системные файлы |
faVolumeID | 8 | Файлы идентификации тома |
faDirectory | 16 | Файлы папок |
aArchive | 32 | Архивные файлы |
faSymLink | 64 | Символьная ссылка |
faAnyFile | 71 | Любые файлы |
Примечание:
Константа faReadOnly из модуля SysUtils имеет то же самое имя, что и константа из модуля Db, определенная в типе TFieldAttribute. Если в своих исходниках вы одновременно используете модули SysUtils и Db, то, чтобы исключить неопределенность, необходимо конкретно указывать из какого модуля вы используете значение константы faReadOnly. В Delphi это записывается так: SysUtils.faReadOnly.
Чтобы проверить файл на определенный аттрибут, комбинируйте значение поля Attr с соотвтствующей константой при помощи оператора AND. Если файл имеет этот аттрибут, результат будет больше 0. Например, если найденый файл является скрытым, то следующие выражения дадут значение TRUE:
Time содержит время последнего изменения файла. Оно может быть преобразовано в формат TDateTime при помощи функции FileDateToDateTime.
Size содержит размер файла в байтах.
Name содержит короткое имя файла с расширением.
FindHandle is an internal handle used to track find state.
FindData (только для Windows) содержит дополнительную информацию, такую как время создания файла, время последнего доступа, а так же длинное и короткое имя файла. См. тип TWin32FindData.
FileDateToDateTime Routine
Description
(Please provide a description in your own words. It is illegal to use the wording from the Delphi Help.)
Technical Comments
(Known issues / Documentation clarifications / Things to be aware of)
Examples
(Please provide links to articles/source code that show how to use this item.)
See Also
(Please provide links to items specifically related to this item.)
User Comments/Tips
(Please leave your name with your comment.)
Ошибка FileDateToDateTime()
Добрый день!
Может быть, кто-нибудь сталкивался с той проблемой, что FileDateToDateTime ( FileAge ( FileName ) ) иногда ошибается на 1-2 секунды?
И может, кто-нибудь придумал, как это лечить?
Мне надо преобразовать дату модификации в строку, а иного пути выйти на DateTimeToStr нет
Цитата (Stibrus @ 28.3.2006, 12:36 ) |
иногда ошибается на 1-2 секунды? |
Задачка, связанная с CVS
CVS считает, что файл изменен, если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries, не совпадает с точностью до секунд с датой/временем изменения файла (с учетом разницы с GMT). На этом ошибка и была поймана — при приведении даты/времени в служебном файле к той дате/времени, которую выдает FileAge, выскакивает ошибка в 1 секунду (один раз заметил 2). Ошибка встречается примерно в 5% случаев.
Это я рассказал к тому, что проблема действительно довольно существенная :hmmm
Цитата (Stibrus @ 28.3.2006, 18:45 ) |
если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries |
почему ты считаешь что это является правильнее чем
Цитата (Stibrus @ 28.3.2006, 18:45 ) |
дате/времени, которую выдает FileAge |
Цитата (Stibrus @ 28.3.2006, 18:45 ) |
с точностью до секунд |
И зачем такая точность?
Цитата (Stibrus @ 28.3.2006, 18:45 ) |
CVS |
Цитата (Romikgy @ 29.3.2006, 08:57 ) |
Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав? |
Control Version System.
Система контроля версий.
Проверить кто прав легко. Просто взять найденный файл и посмотреть его св-ва, как их показывает винда.
Это и будет правильный результат.
Snowy , все совершенно верно, так я и «поймал» ошибку.
2 Romikgy: CVS — система слежения за версиями исходных файлов, крайне полезная когда над проектом работает группа разработчиков.
Немножко углубляясь в задачу, скажу, что мне надо было сделать так, чтобы WinCVS считал файлы неизмененными. Как я уже говорил ранее, путь для этого только один — проставить в служебном файле реальную дату модификации файла. Тут-то и вышел затык — примерно 5% файлов получили погрешность в строке, представляющей эту дату.
Сравнив в Explorer дату/время модификации файла с CVSными, я убедился, что CVS все делает правильно. Отсюда делаю вывод — ошибается приложение на Дельфи.
Далее — два варианта. Либо ошибается FileAge, но (имхо) это просто невозможно, эта функция работает «напрямую» с системой
А явная причина — ошибка пересчета даты/времени из Integer в Float в FileDateToDateTime
В общем, надо делать свою функцию формирования строки на основании даты/времени, возвращаемой FileAge
FileDateToDateTime — Функция Delphi
Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006
Репутация: нет
Всего: нет
Добрый день!
Может быть, кто-нибудь сталкивался с той проблемой, что FileDateToDateTime ( FileAge ( FileName ) ) иногда ошибается на 1-2 секунды?
И может, кто-нибудь придумал, как это лечить?
Мне надо преобразовать дату модификации в строку, а иного пути выйти на DateTimeToStr нет
Romikgy |
|
||
Код |
ChangeDate.Caption := DateTimeToStr(FileDateToDateTime(FileAge(FileList.FileName))); |
Цитата(Stibrus @ 28.3.2006, 12:36 ) |
иногда ошибается на 1-2 секунды? |
Stibrus |
|
|
Poseidon |
|
|
Romikgy |
|
||||||
Цитата(Stibrus @ 28.3.2006, 18:45 ) |
если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries |
почему ты считаешь что это является правильнее чем
Цитата(Stibrus @ 28.3.2006, 18:45 ) |
дате/времени, которую выдает FileAge |
Цитата(Stibrus @ 28.3.2006, 18:45 ) |
с точностью до секунд |
И зачем такая точность?
Цитата(Stibrus @ 28.3.2006, 18:45 ) |
CVS |
Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав?
Snowy |
|
|
Цитата(Romikgy @ 29.3.2006, 08:57 ) |
Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав? |
Control Version System.
Система контроля версий.
Проверить кто прав легко. Просто взять найденный файл и посмотреть его св-ва, как их показывает винда.
Это и будет правильный результат.
Stibrus |
|
|
Romikgy |
|
|
Stibrus |
|
|
Snowy |
|
|
Код |
function GetFileTimeStr(FileName: string): string; var Handle: THandle; FindData: TWin32FindData; LocalFileTime: TFileTime; st: TSystemTime; begin result := »; Handle := FindFirstFile(PChar(FileName), FindData); if Handle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then begin FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToSystemTime(LocalFileTime, st); result := Format(‘%2u.%2u.%4u |
%2u:%2u:%2u’,
[st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond]);
result := StringReplace(result, ‘ ‘, ‘0’, [rfReplaceAll]);
result := StringReplace(result, ‘
‘, ‘ ‘, [rfReplaceAll]);
end;
end;
end;
Так мы избегаем погрешностей TDateTime, который, как известно Double.
А Double = погрешность.
Stibrus |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Наименование | Тип модуль | Описание | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AssignFile | процедура System |
|||||||||||||||||||||||||||
ChDir | процедура System |
|||||||||||||||||||||||||||
CloseFile | процедура System |
|||||||||||||||||||||||||||
CreateDir | функция SysUtils |
|||||||||||||||||||||||||||
DeleteFile | функция SysUtils |
|||||||||||||||||||||||||||
DirectoryExists | функция SysUtils |
|||||||||||||||||||||||||||
DiskFree | функция SysUtils |
|||||||||||||||||||||||||||
DiskSize | функция SysUtils |
|||||||||||||||||||||||||||
File mode | константы System | Используются для открытия и закрытия дисковых файлов.
const fmClosed = $D7B0; // closed file Эти константы используются в первую очередь в Delphi коде, где поле Mode в TFileRec и TTextRec содержит одно из этих значений. | ||||||||||||||||||||||||||
File open mode | константы SysUtils | Константы режима открытия файла используются для контроля режима доступа к файлу или потоку.
Для Windows:Эти константы используются для конроля режима совместного доступа при открытии файла или потока. TFileStream конструктор имеет параметр Mode в котрый вы можете прописать одну из следующих констант:
| ||||||||||||||||||||||||||
FileAccessRights | пременная | Points to the command-line arguments specified when the application is invoked. Только для Linux. В Windows эта переменная игнорируется. | ||||||||||||||||||||||||||
FileAge | функция SysUtils |
|||||||||||||||||||||||||||
FileClose | процедура SysUtils |
|||||||||||||||||||||||||||
FileCreate | функция SysUtils |
|||||||||||||||||||||||||||
FileDateToDateTime | функция SysUtils |
|||||||||||||||||||||||||||
FileExists | функция SysUtils |
|||||||||||||||||||||||||||
FileGetAttr | функция SysUtils |
|||||||||||||||||||||||||||
FileGetDate | функция SysUtils |
|||||||||||||||||||||||||||
FileIsReadOnly | функция SysUtils |
|||||||||||||||||||||||||||
FileOpen | функция SysUtils |
|||||||||||||||||||||||||||
FileRead | функция SysUtils |
|||||||||||||||||||||||||||
FileSearch | функция SysUtils |
|||||||||||||||||||||||||||
FileSeek | функция SysUtils |
|||||||||||||||||||||||||||
FileSetAttr | функция SysUtils |
|||||||||||||||||||||||||||
FileSetDate | функция SysUtils |
|||||||||||||||||||||||||||
FileSetReadOnly | функция SysUtils |
|||||||||||||||||||||||||||
FileWrite | функция SysUtils |
|||||||||||||||||||||||||||
FindClose | процедура SysUtils |
|||||||||||||||||||||||||||
FindFirst | функция SysUtils |
|||||||||||||||||||||||||||
FindNext | функция SysUtils |
|||||||||||||||||||||||||||
ForceDirectories | функция SysUtils |
|||||||||||||||||||||||||||
GetCurrentDir | функция SysUtils |
|||||||||||||||||||||||||||
GetDir | процедура System |
|||||||||||||||||||||||||||
RemoveDir | функция SysUtils |
|||||||||||||||||||||||||||
RenameFile | функция SysUtils |
|||||||||||||||||||||||||||
SetCurrentDir | функция SysUtils |
Константа | Значение | Описание |
---|---|---|
faReadOnly | 1 | Файлы Только для чтения |
faHidden | 2 | Скрытые файлы |
faSysFile | 4 | Системные файлы |
faVolumeID | 8 | Файлы идентификации тома |
faDirectory | 16 | Файлы папок |
aArchive | 32 | Архивные файлы |
faSymLink | 64 | Символьная ссылка |
faAnyFile | 71 | Любые файлы |
Примечание:
Константа faReadOnly из модуля SysUtils имеет то же самое имя, что и константа из модуля Db, определенная в типе TFieldAttribute. Если в своих исходниках вы одновременно используете модули SysUtils и Db, то, чтобы исключить неопределенность, необходимо конкретно указывать из какого модуля вы используете значение константы faReadOnly. В Delphi это записывается так: SysUtils.faReadOnly.
Чтобы проверить файл на определенный аттрибут, комбинируйте значение поля Attr с соотвтствующей константой при помощи оператора AND. Если файл имеет этот аттрибут, результат будет больше 0. Например, если найденый файл является скрытым, то следующие выражения дадут значение TRUE:
Time содержит время последнего изменения файла. Оно может быть преобразовано в формат TDateTime при помощи функции FileDateToDateTime.
Size содержит размер файла в байтах.
Name содержит короткое имя файла с расширением.
FindHandle is an internal handle used to track find state.
FindData (только для Windows) содержит дополнительную информацию, такую как время создания файла, время последнего доступа, а так же длинное и короткое имя файла. См. тип TWin32FindData.
FileDateToDateTime — Функция Delphi
А что значит dwlowDateTime и dwhighDateTime в структуре FileTime?
И как значение типа TdateTime перевести в dwlowDateTime и dwhighDateTime структурЫ FileTime .
Спасибо.
dwlowDateTime и dwhighDateTime это соответственно первые и вторые байты числа, которым представляется время.
>> SPeller
первые и вторые байты. а по понятней можно??
Что такое первые байты числа, а что вторые??
Как они связаны с TDatatime??
Ответьте пожалуйста, мне нужно установить время на файл. это делается через SetFileTime(h,nil,nil,@t1), где t1 — структура FileTime
У меня есть значение Tdatatime , как мне его «воткнуть» в t1 ??
Спасибо.
Младшая ии старшая часть 64 битного целого, а не байтов
Anatoly Podgoretsky © (10.04.02 21:19)
В принципе это одно и то же. Я просто более крестьянским языком попытался выразиться.
Используй SystemTimeToFileTime() для конвертации.
Тоесть как одно и тоже два байта и восемь
Ну всмысле первые 4 и вторые 4 байта 8-ми байтного числа.
Да, вариант представления Int64
Спасибо всем! Особенно ION T ©.
А почему при использовании SystemTimeToFileTime()время всегда на 4 часа больше?? это глюк или что?
А вы случайно не забыли про локальные настройки — ведь время файла должно быть правильным (как в рекламк Бочкарева:) Вы вероятно живете во временном поясе со смещением в 4 часа, так что это ни в коем случае не глюк — так правильно. но если надо, то можно выставлять время с учетом сего, чтобы Винда «скорректировала» в нужную сторону.
>> ION T ©
У меня в настройках винды стоит час пояс Москва и время правильно показывает. а вот если любое время подаешь на вход:
SystemTimeToFileTime(st,t1);
SetFileTime(h,nil,nil,@t1);
то всегда время получается на 4 часа больше, а как можно програмно скоректировать??
Ну так правильно: +3 часа — Москва и +1 час — летнее время.
Ну скорректировать можно вычитанием текущего смещения времени (4 часа, но где-то в реестре читать надо) и установкой. По людски — отнимаешь 4 часа и ставишь. Но крайне не рекомендую так делать — представьте, что этот файл кто-то намылит в сша, там смещение другое(допустим -5 часов) и получится, что файл создан *через* те самые 4 часа, а на такое любой скандиск и половина антивирусов заругаются.
Обрати внимание не название функции SystemTime, а не LocalTime
Спасибо всем. Вообщем я сделал так:
Вычислил разницу между начальной датой и полученной — это и есть корректировка в л. точке земного шара и в любое время !
>> ION T © весьма благодарен!:-)
А не проще корректировать время, используя GetLocalTime и GetSysytemTime?
Спасибо Pat ©. Незнал, так конечно проще. Как код сокращается:-))
Преобразовать TFileTime в TDateTime
Delphi , Синтаксис , Дата и Время
Статья Преобразовать TFileTime в TDateTime раздела Синтаксис Дата и Время может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
Блог GunSmoker-а (переводы)
. when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.
понедельник, 24 ноября 2008 г.
Как распознать тип отдельно взятой временной метки
Это перевод How to recognize different types of timestamps from quite a long way away. Автор: Реймонд Чен. Примечание: в отличие от других постов, этот пост сильно отличается от оригинала. Произведено множество замен от C к Delphi.
Одной из хороших сторон меток времени является количество их форматов, из которых мы можем выбирать. Иногда во время отладки (или при чтении неполной документации) вы можете наткнуться на значение метки времени и задуматься, как перевести его во что-нибудь читабельное. Вот несколько подсказок.
Ниже в примерах мы будем использовать время 26 ноября 2002, 19:25 по PST.
Номер 1: метки времени UNIX
Временные метки UNIX (любое 32-х битное целое в Delphi) записываются числом секунд, прошедших с 1 января 1970 по UTC. Это число записывается в 32-х битное целое. Пожалуй, это единственный сколь-либо распространённый формат метки времени, в котором используются 32-х битные числа.
26 ноября 2002, 19:25 PST = $3DE43B0C.
Если 32-х битное значение начинается с «3» или с «4», то есть вероятность, что это значение является меткой времени в формате времени UNIX (эра цифры «3» начинается в 1995 и заканчивается в 2004).
Чтобы перевести эти значения во что-нибудь читабельное, вы можете воспользоваться модулем JclDateTime из библиотеки JCL. В этом модуле есть функции для перевода меток времени в формате UNIX в формат Win32 FILETIME и в родной формат Delphi TDateTime ( DateTimeToUnixTime / UnixTimeToDateTime и FileTimeToUnixTime / UnixTimeToFileTime ). Или же, начиная, кажется, с Delphi 6, в стандартном модуле DateUtils есть DateTimeToUnix и UnixToDateTime .
Этот формат времени используется библиотеками C (в C runtime library это тип time_t) и службой событий Windows NT (Windows NT event log).
Номер 2: Win32 FILETIME
Значения FILETIME (тип TFileTime в Delphi) в Win32 показывают число 100-наносекундных интервалов с 1 января 1600 по UTC. Эти значения записываются в 64-х битное число.
26 ноября 2002, 19:25 PST = $01C295C4:91150E00.
Если 64-х битное значение начинается с «01» и последующей буквы, то есть вероятность, что это значение представляет собой метку времени в формате FILETIME из Win32 (эра «01A» начинается в 1972, а эра «01F» заканчивается в 2057).
Для конвертации этих значений в читабельный вид, вы можете использовать DateTimeToFileTime / FileTimeToDateTime из JclDateTime . Стандартными средствами использование возможно только в обход — например, с помощью промежуточной конвертации в TSystemTime через FileTimeToSystemTime / SystemTimeToFileTime (одновременно с использованием FileTimeToLocalFileTime / LocalFileTimeToFileTime ), а уж затем в TDateTime через SystemTimeToDateTime / DateTimeToSystemTime (все функции находятся в модулях Windows и SysUtils ).
Номер 3: System.DateTime из CLR
Предупреждение: это самый настоящий материал по .NET (извините меня).
Тип CLR System.DateTime содержит число 100-наносекундных интервалов, начиная с 1 января 1 года по UTC. Это значение записывается в 64-х битное число. Этот формат пока используется не очень часто.
26 ноября 2002, 19:25 PST = $08C462CB:FCED3800? (кто-нибудь, проверьте мои вычисления)
Если 64-х битное значение начинается с «08» и буквы, то это, вероятно, время в формате CLR System.DateTime (эра «08A» начинается в 1970, а эра «08F» заканчивается в 2056).
Для конвертации можно использовать тип TDateTime в Delphi .NET. Там он объявлен как запись с перегруженными операторами. В частности, есть оператор приведения типов, в том числе и от System.DateTime . Т.е. конвертация осуществляется простым приведением типа от System.DateTime к TDateTime в Delphi .NET.
Номер 4: формат времени DOS
Формат метки времени DOS представляет собой битовую маску. С младших к старшим битам: 5 бит — секунды, 6 бит — минуты, 5 бит — час (т.е. время занимает младшие 16 бит), 5 бит — день, 4 бита — месяц, 7 бит — год (т.е. дата занимает старшие 16 бит). Год хранится как смещение от 1980-го. Секунды хранятся двух-секундными интервалами (т.е. если поле «секунды» равно 15, то секунд на самом деле 30).
Эти значения записываются по местному времени.
26 ноября 2002, 19:25 PST = $2D7A9B20.
Чтобы перевести эти значения в читабельный вид, можно воспользоваться DateTimeToDosDateTime / DosDateTimeToDateTime из JCL. А для стандартной реализации проще всего воспользоваться системными функциями DosDateTimeToFileTime / FileTimeToDosDateTime для конвертации их в TFileTime , а затем уже конвертировать TFileTime как и ранее. Кроме того, для прямой конвертации в TDateTime есть функции FileDateToDateTime / DateTimeToFileDate — они также работают с временем в формате DOS, хотя их имена об этом и не говорят.
Примечание: этот формат используют некоторые устаревшие функции Delphi, пришедшие в неё ещё из Турбо Паскаля. Например, FileAge или TSearchRec.Time . Вместо таких функций рекомендуется использовать их современные аналоги (для нашего примера это перегруженный FileAge и TSearchRec.FindData.ftLastWriteTime ).
Номер 5: формат OLE Automation
Формат метки времени OLE (тип TDateTime в Delphi) представляет собой число с плавающей точкой, содержащее число дней с полуночи 30 декабря 1899. Часы и минуты представляются как дробное число дней. Этот формат соответствует родному типу времени в Delphi — TDateTime .
Перевод между форматами
Если вы используете только голые Delphi, то часто нет прямого способа перевести метку времени из одного формата в другой. В этом случае нужно использовать промежуточный формат (как это было в примере с TFileTime ). Хотя модуль JclDateTime из JCL определяет все возможные случаи для упоминаемых форматов (кроме System.DateTime ).
Другие форматы времени
В JScript конструктор объекта Date может создавать объект с integer-а, представляющего миллисекунды с 1970-го. Этот формат почти эквивалентен времени UNIX, просто умноженному на 1000.
Системный тип SYSTEMTIME из Win32 ( TSystemTime в Delphi) по сути является простой записью. Этот тип используется в некоторых функциях WinAPI. Стандартными средствами Delphi его можно конвертировать в TFileTime и TDateTime .
FileDateToDateTime — Функция Delphi
Атрибуты файла. Поиск файла
Еще одна часто выполняемая с файлом операция — поиск файлов в заданном каталоге. Для организации поиска и отбора файлов используются специальные процедуры, а также структура, в которой сохраняются результаты поиска.
ExcludeAttr: Integer; (He используется>
обеспечивает хранение характеристик файла после удачного поиска. Дата и время создания файла хранятся в формате MS-DOS, поэтому для получения этих параметров в принятом в Delphi формате TDateTime необходимо использовать следующую функцию:
function FileDateToDateTime(FileDate: Integer): TDateTime;
Обратное преобразование выполняет функция
function DateTimeToFileDate(DateTime: TDateTime): Integer;
Свойство Attr может содержать комбинацию следующих флагов-значений:
- faReadOnly — только для чтения;
- faDirectory — каталог;
- faHidden — скрытый;
- faArchive — архивный;
- faSysFile — системный;
- faAnyFile — любой.
- favoiumeio — метка тома;
Для определения параметров файла используется оператор AND :
if (SearchRec.Attr AND faReadOnly) > 0
then ShowMessage(‘Файл только для чтения’);
Непосредственно для поиска файлов используются функции FindFirst и FindNext .
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
находит первый файл, заданный полным маршрутом Path и параметрами Attr (см. выше). Если заданный файл найден, функция возвращает 0, иначе — код ошибки Windows. Параметры найденного файла возвращаются в записи F типа TSearchRec .
function FindNext(var F: TSearchRec): Integer;
применяется для повторного поиска следующего файла, удовлетворяющего критерию поиска. При этом используются те параметры поиска, которые заданы последним вызовом функции FindFirst . В случае удачного поиска возвращается 0.
Для освобождения ресурсов, выделенных для выполнения поиска, применяется функция:
procedure FindClose(var F: TSearchRec);
В качестве примера организации поиска файлов рассмотрим фрагмент исходного кода, в котором маршрут поиска файлов задается в однострочном текстовом редакторе DirEdit , а список найденных файлов передается в компонент TListBox .
Файловые функции DELPHI. Файловые операции средствами ShellApi.
В Delphi существует понятие — подпрограммы управления файлами ( category File management routines). Процедуры и функции входящие в эту категорию находятся в модулях System, SysUtils (каталог Source\Rtl\Sys) и FileCtrl (каталог Source\Vcl). Модуль FileCtrl содержит только две функции из категории подпрограмм управления файлами — это DirectoryExists и ForceDirectories. Местонахождение остальных процедур и функций определяется следующим образом. Если в подпрограмме используется файловая переменная, то она входит в модуль System. Если дескриптор или имя файла в виде строки, то в модуль SysUtils. Правда есть исключения (интуитивно понятные) ChDir входит в System. Также в System входят MkDir, RmDir из категории ввода/вывода ( I/O routines). Надо отметить, что все подпрограммы, отнесенные к категориям ввода/вывода и текстовых файлов ( Text file routines) находятся в модуле System (исключая процедуру AssignPrn входящую в модуль Printers каталог Source\Vcl). Вот список подпрограмм отсортирован по категориям и по алфавиту.
File management routines — подпрограммы управления файлами
S ystem procedure AssignFile(var F; FileName: string); Связывает файловую переменную с именем файла
System procedure ChDir(S: string); Изменяет текущий каталог
System procedure CloseFile(var F); Закрывает файл по файловой переменной
SysUtils function CreateDir(const Dir: string): Boolean; Создает новый каталог
SysUtils function DeleteFile(const FileName: string): Boolean; Удаляет файл
FileCtrl function DirectoryExists(Name: string): Boolean; Проверяет наличие каталога
SysUtils function DiskFree(Drive: Byte): Int64; Определяет свободное пространство на диске
SysUtils function DiskSize(Drive: Byte): Int64; Определяет полный размер диска
SysUtils function FileAge(const FileName: string): Integer; Определяет время последнего обновления
SysUtils procedure FileClose(Handle: Integer); Закрывает файл по дескриптору
SysUtils function FileDateToDateTime(FileDate: Integer): TDateTime; Преобразует DOS-дату в Delphi-дату
SysUtils function FileExists(const FileName: string): Boolean; Проверяет наличие файла
SysUtils function FileGetAttr(const FileName: string): Integer; Определяет атрибуты файла
SysUtils function FileGetDate(Handle: Integer): Integer; Определяет время последнего обновления
SysUtils function FileOpen(const FileName: string; Mode: LongWord): Integer; Открывает существующий файл
SysUtils function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer; Читает из файла
SysUtils function FileSearch(const Name, DirList: string): string; Ищет файл в списке каталогов
SysUtils function FileSeek(Handle, Offset, Origin: Integer): Integer; Меняет позицию указателя
SysUtils function FileSetAttr(const FileName: string; Attr: Integer): Integer; Устанавливает атрибуты файла
SysUtils function FileSetDate(Handle: Integer; Age: Integer): Integer; Устанавливает время последнего обновления
SysUtils function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer; Записывает в файл
SysUtils procedure FindClose(var F: TSearchRec); Прекращает поиск файлов
SysUtils function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; Начинает поиск файлов
SysUtils function FindNext(var F: TSearchRec): Integer; Продолжает поиск файлов
FileCtrl function ForceDirectories(Dir: string): Boolean; Создает все каталоги пути
SysUtils function GetCurrentDir: string; Определяет текущий каталог
System procedure GetDir(D: Byte; var S: string); Определяет текущий каталог
SysUtils function RemoveDir(const Dir: string): Boolean; Удаляет каталог
SysUtils function RenameFile(const OldName, NewName: string): Boolean; Переименовывает файл
SysUtils function SetCurrentDir(const Dir: string): Boolean; Устанавливает текущий каталог
I/O routines — подпрограммы ввода/вывода
Модуль Подпрограмма
System procedure Append(var F: Text); Добавляет текст в конец файла
System procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]); Читает блок из файла
System procedure BlockWrite(var f: File; var Buf; Count: Integer [; var AmtTransferred: Integer]); Записывает блок в файл
System function Eof(var F): Boolean; Определяет конец файла
System function FilePos(var F): Longint; Определяет позицию указателя
System function FileSize(var F): Integer; Определяет размер файла
System function IOResult: Integer; Определяет ошибки предыдущего ввода/вывода
System procedure MkDir(S: string); Создает каталог
System procedure Rename(var F; Newname:string); Переименовывает файл
System procedure Reset(var F [: File; RecSize: Word ] ); Открывает файл
System procedure Rewrite(var F: File [; Recsize: Word ] ); Создает и открывает новый файл
System procedure RmDir(S: string); Удаляет каталог
System procedure Seek(var F; N: Longint); Устанавливает позицию указателя
System procedure Truncate(var F); Усекает файл до текущей позиции указателя
Text file routines — подпрограммы текстовых файлов
Модуль Подпрограмма
Printers procedure AssignPrn(var F: Text); Связывает файловую переменную с принтером
System function Eoln [(var F: Text) ]: Boolean; Определяет конец строки
System procedure Erase(var F); Удаляет файл
System procedure Flush(var F: Text); Переписывает данные в файл из его буфера
System procedure Read(F , V1 [, V2. Vn ] ); Читает из файла
System procedure Readln([ var F: Text; ] V1 [, V2, . Vn ]); Читает из файла до конца строки
System function SeekEof [ (var F: Text) ]: Boolean; Определяет конец файла
System function SeekEoln [ (var F: Text) ]: Boolean; Определяет конец строки
System procedure SetTextBuf(var F: Text; var Buf [ ; Size: Integer] ); Устанавливает новый буфер
System procedure Write(F, V1 [, V2. Vn ] ); Записывает в файл
System procedure Writeln([ var F: Text; ] V1 [, V2, . Vn ] ); Записывает в файл с концом строки
Проверяем наличие файла и записываем его
type
TFileData=record
Name:String[10];
ExtDat:Extended;
end;
var
Cals: File of TFileData;
CalsData: TFileData;
procedure NAME;
//Описание процедуры
var p: Real;
u: Byte;
begin
Road:=’<файл>.dat’;
Dest:=’<каталог>‘+Road;
try
AssignFile(Cals,Dest);
// Если файл существует открываем на чтение, иначе создаем новый
If FileExists(Cals) then Reset(cals) else Rewrite(cals);
// установим позицию чтения в конец файла
seek (cals,filesize(cals));
CalsData.Name := ‘название параметра’;
CalsData.ExtDat := <сами данные>;
Write(Cals,CalsData);
except
on E: EInOutError do
ShowMessage(‘При выполнении файловой операции возникла ошибка’+
‘ № ‘+ IntToStr(E. ErrorCode)+’: ‘+SysErrorMessage(GetLastError));
on E: EAccessViolation do
ShowMessage(‘Ошибка!: ‘+SysErrorMessage(GetLastError));
end;
CloseFile(cals); //Независимо от того что произошло выше закрываем открытый файл
end;
Перепишем файл a.dat в файл b.dat, удалив признаки конца файла:
Proedure MyWrite;
var
f1,f2 :file of Byte;
a :Byte;
i :Longint;
begin
<$I->
AssignFile(f1, ‘a.dat’);
AssignFile(f2, ‘b.dat’);
Reset(f1);
Rewrite(f2);
for i := 1 to FileSize(f1) do
begin
Read(f1, a);
if a <> 26 then Write(f2, a);
end;
CloseFile(f1);
CloseFile(f2);
end.
Файл записей. Пишем и читаем любую:
Procedure MyBook;
type TR=Record
Name:string[100];
Age:Byte;
Income:Real;
end;
var f:file of TR;
r:TR;
begin
//assign file
assignFile(f, ‘MyFileName’);
//open file
if FileExists(‘MyFileName’) then
reset(f)
else
rewrite(f);
//чтение 10й записи
seek(f,10);
read(f,r);
//запись 20й записи
seek(f, 20);
write(f,r);
closefile(f);
end;
Файловые операции средствами ShellAPI.
Автор: Владимир Татарчевский
Рассмотрим применение функции SHFileOperation.
function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall;
Функция позволяет производить копирование, перемещение, переименование и удаление (в том числе и в Recycle Bin) объектов файловой системы.
Функция возвращает 0, если операция выполнена успешно, и ненулевое значение в противном случае.
Функция имеет единственный аргумент — структуру типа TSHFileOpStruct, в которой и передаются все необходимые данные. Эта структура выглядит следующим образом:
_SHFILEOPSTRUCTA = packed record
Wnd: HWND;
wFunc: UINT;
pFrom: PAnsiChar;
pTo: PAnsiChar;
fFlags: FILEOP_FLAGS;
fAnyOperationsAborted: BOOL;
hNameMappings: Pointer;
lpszProgressTitle: PAnsiChar; < используется только при установленном флаге FOF_SIMPLEPROGRESS >
end;
Поля структуры имеют следующее назначение:
hwnd Хэндл окна, на которое будут выводиться диалоговые окна о ходе операции.
wFunc Требуемая операция. Может принимать одно из значений:
FO_COPY Копирует файлы, указанные в pFrom в папку, указанную в pTo.
FO_DELETE Удаляет файлы, указанные pFrom (pTo игнорируется).
FO_MOVE Перемещает файлы, указанные в pFrom в папку, указанную в pTo.
FO_RENAME Переименовывает файлы, указанные в pFrom.
pFrom — указатель на буфер, содержащий пути к одному или нескольким файлам. Если файлов несколько, между путями ставится нулевой байт. Список должен
заканчиваться двумя нулевыми байтами.
pTo — аналогично pFrom, но содержит путь к директории — адресату, в которую производится копирование или перемещение файлов. Также может
содержать несколько путей. При этом нужно установить флаг FOF_MULTIDESTFILES.
fFlags — управляющие флаги.
FOF_ALLOWUNDO Если возможно, сохраняет информацию для возможности UnDo.
FOF_CONFIRMMOUSE Не реализовано.
FOF_FILESONLY Если в поле pFrom установлено *.*, то операция будет производиться только с файлами.
FOF_MULTIDESTFILES Указывает, что для каждого исходного файла в поле pFrom указана своя директория — адресат.
FOF_NOCONFIRMATION Отвечает «yes to all» на все запросы в ходе опеации.
FOF_NOCONFIRMMKDIR Не подтверждает создание нового каталога, если операция требует, чтобы он был создан.
FOF_RENAMEONCOLLISION В случае, если уже существует файл с данным именем, создается файл с именем «Copy #N of. »
FOF_SILENT Не показывать диалог с индикатором прогресса.
FOF_SIMPLEPROGRESS Показывать диалог с индикатором прогресса, но не показывать имен файлов.
FOF_WANTMAPPINGHANDLE Вносит hNameMappings элемент. Дескриптор должен быть освобожден функцией SHFreeNameMappings.
fAnyOperationsAborted
Принимает значение TRUE если пользователь прервал любую файловую операцию до ее завершения и FALSE в ином случае.
hNameMappings — дескриптор объекта отображения имени файла, который содержит массив структур SHNAMEMAPPING. Каждая структура содержит старые и новые имена пути для каждого файла, который перемещался, был скопирован, или переименован. Этот элемент используется только, если установлен флаг FOF_WANTMAPPINGHANDLE.
lpszProgressTitle — указатель на строку, используемую как заголовок для диалогового окна прогресса. Этот элемент используется только, если установлен флаг FOF_SIMPLEPROGRESS.
Примечание. Если pFrom или pTo не указаны, берутся файлы из текущей директории. Текущую директорию можно установить с помощью функции
SetCurrentDirectory и получить функцией GetCurrentDirectory.
Добавьте в секцию uses модуль ShellAPI, в котором определена функция SHFileOperation.
procedure TForm1.Button1Click(Sender: TObject);
var
SHFileOpStruct : TSHFileOpStruct;
From : array [0..255] of Char;
begin
SetCurrentDirectory( PChar( ‘C:\’ ) );
From := ‘Test1.tst’ + #0 + ‘Test2.tst’ + #0 + #0;
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_DELETE;
pFrom := @From;
pTo := nil;
fFlags := 0;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation( SHFileOpStruct );
end;
Ни один из флагов не установлен. Если вы хотите не просто удалить файлы, а переместить их в корзину, должен быть
установлен флаг FOF_ALLOWUNDO.
Напишем функцию, создающую из массива строк буфер для передачи его в качестве параметра pFrom. После
каждой строки в буфер вставляется нулевой байт, в конце списка — два нулевых байта.
type TBuffer = array of Char;
procedure CreateBuffer( Names : array of string; var P : TBuffer );
var I, J, L : Integer;
begin
for I := Low( Names ) to High( Names ) do
begin
L := Length( P );
SetLength( P, L + Length( Names[ I ] ) + 1 );
for J := 0 to Length( Names[ I ] ) — 1 do
P[ L + J ] := Names[ I, J + 1 ];
P[ L + J ] := #0;
end;
SetLength( P, Length( P ) + 1 );
P[ Length( P ) ] := #0;
end;
Функция, удаляющая файлы, переданные ей в списке Names. Параметр ToRecycle определяет, будут ли файлы перемещены в корзину или удалены. Функция возвращает 0, если операция выполнена успешно, и ненулевое значение, если функции переданы имена несуществующих файлов.
function DeleteFiles( Handle : HWnd; Names : array of string; ToRecycle : Boolean ) : Integer;
var
SHFileOpStruct : TSHFileOpStruct;
Src : TBuffer;
begin
CreateBuffer( Names, Src );
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_DELETE;
pFrom := Pointer( Src );
pTo := nil;
fFlags := 0;
if ToRecycle then fFlags := FOF_ALLOWUNDO;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
Result := SHFileOperation( SHFileOpStruct );
Src := nil;
end;
Освобождаем буфер Src простым присваиванием значения nil. Потери памяти при этом не происходит, происходит корректное уничтожение динамического массива.
Проверяем :
procedure TForm1.Button1Click(Sender: TObject);
begin
DeleteFiles( Handle, [ ‘C:\Test1’, ‘C:\Test2’ ], True );
end;
Файлы ‘Test1’ и ‘Test2’ удаляются совсем, без помещения в корзину, несмотря на установленный флаг FOF_ALLOWUNDO. При использовании функции SHFileOperation используйте полные пути, когда это возможно.
Копирование и перемещение.
Функция перемещает файлы указанные в списке Src в директорию Dest. Параметр Move определяет, будут ли файлы перемещаться или копироваться. Параметр AutoRename указывает, переименовывать ли файлы в случае конфликта имен.
function CopyFiles( Handle : Hwnd; Src : array of string; Dest : string; Move : Boolean; AutoRename : Boolean ) : Integer;
var
SHFileOpStruct : TSHFileOpStruct;
SrcBuf : TBuffer;
begin
CreateBuffer( Src, SrcBuf );
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_COPY;
if Move then wFunc := FO_MOVE;
pFrom := Pointer( SrcBuf );
pTo := PChar( Dest );
fFlags := 0;
if AutoRename then fFlags := FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
Result := SHFileOperation( SHFileOpStruct );
SrcBuf := nil;
end;
Выполнение:
procedure TForm1.Button1Click(Sender: TObject);
begin
CopyFiles( Handle, [ ‘C:\Test1’, ‘C:\Test2’ ], ‘C:\Temp’, True, True );
end;
Переименование.
function RenameFiles( Handle : HWnd; Src : string; New : string; AutoRename : Boolean ) : Integer;
var SHFileOpStruct : TSHFileOpStruct;
begin
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_RENAME;
pFrom := PChar( Src );
pTo := PChar( New );
fFlags := 0;
if AutoRename then fFlags := FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
Result := SHFileOperation( SHFileOpStruct );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RenameFiles( Handle, ‘C:\Test1’ , ‘C:\Test3’ , False );
end;