FileDateToDateTime — Функция Delphi

Типы, функции и процедуры Delphi для работы с файлами.

Содержание:


Процедуры и функции для работы с файлами.


Тип TSearchRec.


Тип TWin32FindData.


Процедуры и функции для работы с файлами

Ниже приведена таблица, содержащая стандартные процедуры и функции Delphi7 для работы с файлами и их краткое описание. Функции в таблице расположены в алфавитном порядке.

Связывает имя внешнего дискового файла с файловой переменной.

procedure AssignFile(var F; FileName: string);

F — имя файловой переменной
FileName — имя файла

Изменяет текущую директорию.

procedure ChDir(const S: string); overload;
procedure ChDir(P: PChar); overload;

Разрывает связь между файловой переменной и внешним дисковым файлом.

procedure CloseFile(var F);

Создает новую директорию.

function CreateDir(const Dir: string): Boolean;

Удаляет файл с диска.

function DeleteFile(const FileName: string): Boolean;

Определяет существует ли указанная директория.

function DirectoryExists(const Directory: string): Boolean;

Возвращает число свободных байт на указанном диске.

function DiskFree(Drive: Byte): Int64;

Drive — номер диска, где 0 = текущий диск, 1 = A, 2 = B . и т.д.

Возвращает размер указанного диска в байтах.

function DiskSize(Drive: Byte): Int64;

Drive — номер диска, где 0 = текущий диск, 1 = A, 2 = B . и т.д.

Возвращает время последней модификации файла (timestamp) в формате операционной системы. Полученное значение может быть преобразовано в формат TDateTime при помощи функции FileDateToDateTime.

function FileAge(const FileName: string): Integer;

Закрывает указанный файл.

procedure FileClose(Handle: Integer);

Создает новый файл.

function FileCreate(const FileName: string): Integer; overload;
function FileCreate(const FileName: string; Rights: Integer): Integer; overload;

Если возвращаемое значение больше 0 функция выполнена успешно и его значение соответствует handle открытого файла. -1 — произошла ошибка открытия файла.
Параметр Rights используется только для Linux. В Windows он игнорируется.

Преобразует значение времени файла (timestamp) из формата операционной системы в TDateTime.

function FileDateToDateTime(FileDate: Integer): TDateTime;

Проверяет существует ли указанный файл.

function FileExists(const FileName: string): Boolean;

Возвращает файловые аттрибуты заданного файла как строку бит. Возвращаемое значение полностью соответствует полю Attr в TSearchRec..

function FileGetAttr(const FileName: string): Integer;

Возвращает время последней модификации файла (timestamp) в формате операционной системы. Используйте её для файла, заданного его handle.

function FileGetDate(Handle: Integer): Integer;

Возвращает TRUE если файл можно открыть только для чтения.

function FileIsReadOnly(const FileName: string): Boolean;

Открывает указанный файл в режиме, заданном при помощи одной из констант File open mode.

function FileOpen(const FileName: string; Mode: LongWord): Integer;

Если возвращаемое значение больше 0 функция выполнена успешно и его значение соответствует handle открытого файла. -1 — произошла ошибка открытия файла.

Читает указанное число байт из файла в буфер. Перед этим файл должен быть открыт при помощи функции FileOpen или FileCreate.

function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;

Handle — хендл файла, возвращаемый функциями FileCreate или FileOpen
Buffer — буфер
Count — размер буфера

Возвращаемое значение — действительное количество полученных байт. Оно может быть меньше размера буфера.

Ищет файл в указанных папках.

function FileSearch(const Name, DirList: string): string;

Name — короткое имя файла
DirList — список директорий для поиска. Для Windows директории для поиска в списке отделяются друг от друга точкой с запятой, а в Linux — двоеточием.

Возвращаемое значение — полное имя файла. Если файл не найден — пустая строка.

Перепозиционирует позицию чтения/записи в открытом файле. Перед этим файл должен быть открыт при помощи функции FileOpen или FileCreate.

function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64;overload;

Handle — хендл файла, возвращаемый функциями FileCreate или FileOpen
Offset — указывает число байт смещения от Origin, куда будет перепозизиционирована точка.
Origin — определяет три варианта позиционирования:
0 — смещение задается относительно начала файла;
1 — смещение задается относительно текущей позиции;
2 — смещение задается относительно конца файла.

Если FileSeek выполнена успешно, она возвращает новую позицию точки чтения/записи; иначе она возвращает -1.

Устанавливает файловые аттрибуты заданного файла.

function FileSetAttr(const FileName: string; Attr: Integer): Integer;

Значение Attr формируется комбинацией соответствующих констант файловых аттрибутов как показано ниже:

Возвращаемое значение — 0; иначе — код ошибки.

Примечание: Значения констант файловых аттрибутов приведены в описании TSearchRec.

Примечание: FileSetAttr доступна только для Windows.

Устанавливаетвремя последней модификации файла (timestamp) в формате операционной системы.

Для Windows:
function FileSetDate(Handle: Integer; Age: Integer): Integer; overload;

Cross-platform:
function FileSetDate(const FileName: string; Age: Integer): Integer; overload;

Handle — handle файла для изменения (Этот синтаксис доступен только для Windows.);
FileName — имя файла;
Age — устанавливаемое время модификации в формате операционной системы. Используйте функцию DateTimeToFileDate для перевод времени из формата TDateTime в формат операционной системы.

Возвращаемое значение — 0; иначе — код ошибки.

Разрешает использовать файл только для чтения.

function FileSetReadOnly(const FileName: string; ReadOnly: Boolean): Boolean;

Записывает содержимое буфера в текущую позицию в файле.

function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;

Handle — хендл файла, возвращаемый функциями FileCreate или FileOpen
Buffer — буфер
Count — число байт, передаваемых файлу из буфера

Возвращаемое значение — действительное количество записаных байт или -1 в случае ошибки.

Освобождает память, выделенную под функцию FindFirst и прерывает последовательность FindFirst/FindNext.

Ищет первый файл с заданными аттрибутами в указанной папке.

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

Path — имя папки и маска имен файлов для поиска, включая wildcard characters. (Например, ‘.\test\*.*’ задает все файлы в текущей папке.)
Attr — аттрибут, указывающий включать в поиск специальные файлы в дополнение к нормальным. Аттрибуты можно комбинировать, складывая значения. Например, (faReadOnly + faHidden).
F — возвращаемый параметр. Результат работы функции.

Возвращаемое значение — 0, если файл найден; иначе — код ошибки.

Возвращает имя следующего файла с параметрами, предварительно заданными функцией FindFirst.

F — возвращаемый параметр. Результат работы функции.

Возвращаемое значение — 0, если файл найден; иначе — код ошибки.

Создает новую папку, включая родительские папки, если они до этого не существовали, и родительские папки.

function ForceDirectories(Dir: string): Boolean;

Возвращает полное имя рабочей папки.

function GetCurrentDir: string;

Возвращает имя рабочей папки.

procedure GetDir(D: Byte; var S: string);

D — номер диска, где 0 = текущий диск, 1 = A, 2 = B, 3 = C . и т.д.
S — возвращаемый параметр. Результат работы процедуры.

Удаляет существующую пустую папку.

function RemoveDir(const Dir: string): Boolean;

Изменяет имя файла.

function RenameFile(const OldName, NewName: string): Boolean

Назначает рабочую папку.

function SetCurrentDir(const Dir: string): Boolean;

Тип TSearchRec

TSearchRec содержит информацию о файле, найденом при помощи функции FindFirst или FindNext.

Тип TSearchRec определяет информацию о файле, найденую путем вызова функции FindFirst или FindNext. Если файл найлен, поля параметров TSearchRec изменяются в соответствии с найденным файлом.

Attr — представляет файловые аттрибуты файла. Проверяйте параметр Attr на следующие константы аттрибутов или их значения чтобы узнать какие аттрибуты назначены данному файлу.

В Windows константы аттрибутов полностью соответствуют файловым аттрибутам DOS.

Наименование Тип
модуль
Описание
AssignFile процедура
System
ChDir процедура
System
CloseFile процедура
System
CreateDir функция
SysUtils
DeleteFile функция
SysUtils
DirectoryExists функция
SysUtils
DiskFree функция
SysUtils
DiskSize функция
SysUtils
File mode константы
System
Используются для открытия и закрытия дисковых файлов.

const fmClosed = $D7B0; // closed file
const fmInput = $D7B1; // reset file (TTextRec)
const fmOutput = $D7B2; // rewritten file (TTextRec)
const fmInOut = $D7B3; // reset or rewritten file (TFileRec)
const fmCRLF = $8; // DOS-style EoL and EoF markers (TTextRec)
const fmMask = $D7B3; // mask out fmCRLF flag (TTextRec)

Эти константы используются в первую очередь в Delphi коде, где поле Mode в TFileRec и TTextRec содержит одно из этих значений.

File open mode константы
SysUtils
Константы режима открытия файла используются для контроля режима доступа к файлу или потоку.

Для Windows:

Эти константы используются для конроля режима совместного доступа при открытии файла или потока.

TFileStream конструктор имеет параметр Mode в котрый вы можете прописать одну из следующих констант:

Константа Описание
fmCreate Если файл уже существует, то он открывается для записи, иначе создается новый файл. В отличие от других констант, которые декларируются в модуле SysUtil, эта константа декларируется в модуле classes.
fmOpenRead Открываетдоступ только для чтения.
fmOpenWrite Открываетдоступ только для записи.
fmOpenReadWrite Открывает доступ для чтения и записи.
fmShareCompat Compatible with the way FCBs are opened. Не используйте этот режим в кросс-платформенных приложениях.
fmShareExclusive Доступ к чтению и записи запрещен.
fmShareDenyWrite Доступ для записи запрещен.
fmShareDenyRead Доступ для чтения запрещен. Не используйте этот режим в кросс-платформенных приложениях.
fmShareDenyNone Открывает полный доступ для других.
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 нет

Профиль
Группа: Участник Клуба
Сообщений: 7278
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 144

Romikgy
Дата 28.3.2006, 13:47 (ссылка) | (нет голосов) Загрузка .
Код
ChangeDate.Caption :=
DateTimeToStr(FileDateToDateTime(FileAge(FileList.FileName)));
Цитата(Stibrus @ 28.3.2006, 12:36 )
иногда ошибается на 1-2 секунды?

Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет

Задачка, связанная с CVS
CVS считает, что файл изменен, если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries, не совпадает с точностью до секунд с датой/временем изменения файла (с учетом разницы с GMT). На этом ошибка и была поймана — при приведении даты/времени в служебном файле к той дате/времени, которую выдает FileAge, выскакивает ошибка в 1 секунду (один раз заметил 2). Ошибка встречается примерно в 5% случаев.

Это я рассказал к тому, что проблема действительно довольно существенная

Это сообщение отредактировал(а) Stibrus — 28.3.2006, 19:50

Stibrus
Дата 28.3.2006, 19:45 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133

Poseidon
Дата 28.3.2006, 20:44 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 7278
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 144

Romikgy
Дата 29.3.2006, 08:57 (ссылка) | (нет голосов) Загрузка .
Цитата(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

Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав?

Профиль
Группа: Модератор
Сообщений: 11360
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 483

Snowy
Дата 29.3.2006, 09:27 (ссылка) | (нет голосов) Загрузка .
Цитата(Romikgy @ 29.3.2006, 08:57 )
Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав?

Control Version System.
Система контроля версий.

Проверить кто прав легко. Просто взять найденный файл и посмотреть его св-ва, как их показывает винда.
Это и будет правильный результат.

Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет

Snowy , все совершенно верно, так я и «поймал» ошибку.
2 Romikgy: CVS — система слежения за версиями исходных файлов, крайне полезная когда над проектом работает группа разработчиков.

Немножко углубляясь в задачу, скажу, что мне надо было сделать так, чтобы WinCVS считал файлы неизмененными. Как я уже говорил ранее, путь для этого только один — проставить в служебном файле реальную дату модификации файла. Тут-то и вышел затык — примерно 5% файлов получили погрешность в строке, представляющей эту дату.

Сравнив в Explorer дату/время модификации файла с CVSными, я убедился, что CVS все делает правильно. Отсюда делаю вывод — ошибается приложение на Дельфи.

Далее — два варианта. Либо ошибается FileAge, но (имхо) это просто невозможно, эта функция работает «напрямую» с системой
А явная причина — ошибка пересчета даты/времени из Integer в Float в FileDateToDateTime

В общем, надо делать свою функцию формирования строки на основании даты/времени, возвращаемой FileAge

Это сообщение отредактировал(а) Stibrus — 29.3.2006, 10:52

Stibrus
Дата 29.3.2006, 10:30 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 7278
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 25
Всего: 144

Romikgy
Дата 29.3.2006, 11:13 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет

Помимо GetAge опробованы следующие методы:
1. Через TSearchRec
2. FileGetDate()

Оба дали одинаковый результат (т.е. неудовлетворительный)

Вывод: дело все же в FileDateToDateTime()

Stibrus
Дата 29.3.2006, 17:26 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 11360
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 483

Snowy
Дата 29.3.2006, 17:57 (ссылка) | (нет голосов) Загрузка .
Код
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 = погрешность.

Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Типы, функции и процедуры Delphi для работы с файлами.

Содержание:


Процедуры и функции для работы с файлами.


Тип TSearchRec.


Тип TWin32FindData.


Процедуры и функции для работы с файлами

Ниже приведена таблица, содержащая стандартные процедуры и функции Delphi7 для работы с файлами и их краткое описание. Функции в таблице расположены в алфавитном порядке.

Stibrus
Дата 29.3.2006, 19:49 (ссылка) | (нет голосов) Загрузка .

Связывает имя внешнего дискового файла с файловой переменной.

procedure AssignFile(var F; FileName: string);

F — имя файловой переменной
FileName — имя файла

Изменяет текущую директорию.

procedure ChDir(const S: string); overload;
procedure ChDir(P: PChar); overload;

Разрывает связь между файловой переменной и внешним дисковым файлом.

procedure CloseFile(var F);

Создает новую директорию.

function CreateDir(const Dir: string): Boolean;

Удаляет файл с диска.

function DeleteFile(const FileName: string): Boolean;

Определяет существует ли указанная директория.

function DirectoryExists(const Directory: string): Boolean;

Возвращает число свободных байт на указанном диске.

function DiskFree(Drive: Byte): Int64;

Drive — номер диска, где 0 = текущий диск, 1 = A, 2 = B . и т.д.

Возвращает размер указанного диска в байтах.

function DiskSize(Drive: Byte): Int64;

Drive — номер диска, где 0 = текущий диск, 1 = A, 2 = B . и т.д.

Возвращает время последней модификации файла (timestamp) в формате операционной системы. Полученное значение может быть преобразовано в формат TDateTime при помощи функции FileDateToDateTime.

function FileAge(const FileName: string): Integer;

Закрывает указанный файл.

procedure FileClose(Handle: Integer);

Создает новый файл.

function FileCreate(const FileName: string): Integer; overload;
function FileCreate(const FileName: string; Rights: Integer): Integer; overload;

Если возвращаемое значение больше 0 функция выполнена успешно и его значение соответствует handle открытого файла. -1 — произошла ошибка открытия файла.
Параметр Rights используется только для Linux. В Windows он игнорируется.

Преобразует значение времени файла (timestamp) из формата операционной системы в TDateTime.

function FileDateToDateTime(FileDate: Integer): TDateTime;

Проверяет существует ли указанный файл.

function FileExists(const FileName: string): Boolean;

Возвращает файловые аттрибуты заданного файла как строку бит. Возвращаемое значение полностью соответствует полю Attr в TSearchRec..

function FileGetAttr(const FileName: string): Integer;

Возвращает время последней модификации файла (timestamp) в формате операционной системы. Используйте её для файла, заданного его handle.

function FileGetDate(Handle: Integer): Integer;

Возвращает TRUE если файл можно открыть только для чтения.

function FileIsReadOnly(const FileName: string): Boolean;

Открывает указанный файл в режиме, заданном при помощи одной из констант File open mode.

function FileOpen(const FileName: string; Mode: LongWord): Integer;

Если возвращаемое значение больше 0 функция выполнена успешно и его значение соответствует handle открытого файла. -1 — произошла ошибка открытия файла.

Читает указанное число байт из файла в буфер. Перед этим файл должен быть открыт при помощи функции FileOpen или FileCreate.

function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;

Handle — хендл файла, возвращаемый функциями FileCreate или FileOpen
Buffer — буфер
Count — размер буфера

Возвращаемое значение — действительное количество полученных байт. Оно может быть меньше размера буфера.

Ищет файл в указанных папках.

function FileSearch(const Name, DirList: string): string;

Name — короткое имя файла
DirList — список директорий для поиска. Для Windows директории для поиска в списке отделяются друг от друга точкой с запятой, а в Linux — двоеточием.

Возвращаемое значение — полное имя файла. Если файл не найден — пустая строка.

Перепозиционирует позицию чтения/записи в открытом файле. Перед этим файл должен быть открыт при помощи функции FileOpen или FileCreate.

function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64;overload;

Handle — хендл файла, возвращаемый функциями FileCreate или FileOpen
Offset — указывает число байт смещения от Origin, куда будет перепозизиционирована точка.
Origin — определяет три варианта позиционирования:
0 — смещение задается относительно начала файла;
1 — смещение задается относительно текущей позиции;
2 — смещение задается относительно конца файла.

Если FileSeek выполнена успешно, она возвращает новую позицию точки чтения/записи; иначе она возвращает -1.

Устанавливает файловые аттрибуты заданного файла.

function FileSetAttr(const FileName: string; Attr: Integer): Integer;

Значение Attr формируется комбинацией соответствующих констант файловых аттрибутов как показано ниже:

Возвращаемое значение — 0; иначе — код ошибки.

Примечание: Значения констант файловых аттрибутов приведены в описании TSearchRec.

Примечание: FileSetAttr доступна только для Windows.

Устанавливаетвремя последней модификации файла (timestamp) в формате операционной системы.

Для Windows:
function FileSetDate(Handle: Integer; Age: Integer): Integer; overload;

Cross-platform:
function FileSetDate(const FileName: string; Age: Integer): Integer; overload;

Handle — handle файла для изменения (Этот синтаксис доступен только для Windows.);
FileName — имя файла;
Age — устанавливаемое время модификации в формате операционной системы. Используйте функцию DateTimeToFileDate для перевод времени из формата TDateTime в формат операционной системы.

Возвращаемое значение — 0; иначе — код ошибки.

Разрешает использовать файл только для чтения.

function FileSetReadOnly(const FileName: string; ReadOnly: Boolean): Boolean;

Записывает содержимое буфера в текущую позицию в файле.

function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;

Handle — хендл файла, возвращаемый функциями FileCreate или FileOpen
Buffer — буфер
Count — число байт, передаваемых файлу из буфера

Возвращаемое значение — действительное количество записаных байт или -1 в случае ошибки.

Освобождает память, выделенную под функцию FindFirst и прерывает последовательность FindFirst/FindNext.

Ищет первый файл с заданными аттрибутами в указанной папке.

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

Path — имя папки и маска имен файлов для поиска, включая wildcard characters. (Например, ‘.\test\*.*’ задает все файлы в текущей папке.)
Attr — аттрибут, указывающий включать в поиск специальные файлы в дополнение к нормальным. Аттрибуты можно комбинировать, складывая значения. Например, (faReadOnly + faHidden).
F — возвращаемый параметр. Результат работы функции.

Возвращаемое значение — 0, если файл найден; иначе — код ошибки.

Возвращает имя следующего файла с параметрами, предварительно заданными функцией FindFirst.

F — возвращаемый параметр. Результат работы функции.

Возвращаемое значение — 0, если файл найден; иначе — код ошибки.

Создает новую папку, включая родительские папки, если они до этого не существовали, и родительские папки.

function ForceDirectories(Dir: string): Boolean;

Возвращает полное имя рабочей папки.

function GetCurrentDir: string;

Возвращает имя рабочей папки.

procedure GetDir(D: Byte; var S: string);

D — номер диска, где 0 = текущий диск, 1 = A, 2 = B, 3 = C . и т.д.
S — возвращаемый параметр. Результат работы процедуры.

Удаляет существующую пустую папку.

function RemoveDir(const Dir: string): Boolean;

Изменяет имя файла.

function RenameFile(const OldName, NewName: string): Boolean

Назначает рабочую папку.

function SetCurrentDir(const Dir: string): Boolean;

Тип TSearchRec

TSearchRec содержит информацию о файле, найденом при помощи функции FindFirst или FindNext.

Тип TSearchRec определяет информацию о файле, найденую путем вызова функции FindFirst или FindNext. Если файл найлен, поля параметров TSearchRec изменяются в соответствии с найденным файлом.

Attr — представляет файловые аттрибуты файла. Проверяйте параметр Attr на следующие константы аттрибутов или их значения чтобы узнать какие аттрибуты назначены данному файлу.

В Windows константы аттрибутов полностью соответствуют файловым аттрибутам DOS.

Наименование Тип
модуль
Описание
AssignFile процедура
System
ChDir процедура
System
CloseFile процедура
System
CreateDir функция
SysUtils
DeleteFile функция
SysUtils
DirectoryExists функция
SysUtils
DiskFree функция
SysUtils
DiskSize функция
SysUtils
File mode константы
System
Используются для открытия и закрытия дисковых файлов.

const fmClosed = $D7B0; // closed file
const fmInput = $D7B1; // reset file (TTextRec)
const fmOutput = $D7B2; // rewritten file (TTextRec)
const fmInOut = $D7B3; // reset or rewritten file (TFileRec)
const fmCRLF = $8; // DOS-style EoL and EoF markers (TTextRec)
const fmMask = $D7B3; // mask out fmCRLF flag (TTextRec)

Эти константы используются в первую очередь в Delphi коде, где поле Mode в TFileRec и TTextRec содержит одно из этих значений.

File open mode константы
SysUtils
Константы режима открытия файла используются для контроля режима доступа к файлу или потоку.

Для Windows:

Эти константы используются для конроля режима совместного доступа при открытии файла или потока.

TFileStream конструктор имеет параметр Mode в котрый вы можете прописать одну из следующих констант:

Константа Описание
fmCreate Если файл уже существует, то он открывается для записи, иначе создается новый файл. В отличие от других констант, которые декларируются в модуле SysUtil, эта константа декларируется в модуле classes.
fmOpenRead Открываетдоступ только для чтения.
fmOpenWrite Открываетдоступ только для записи.
fmOpenReadWrite Открывает доступ для чтения и записи.
fmShareCompat Compatible with the way FCBs are opened. Не используйте этот режим в кросс-платформенных приложениях.
fmShareExclusive Доступ к чтению и записи запрещен.
fmShareDenyWrite Доступ для записи запрещен.
fmShareDenyRead Доступ для чтения запрещен. Не используйте этот режим в кросс-платформенных приложениях.
fmShareDenyNone Открывает полный доступ для других.
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;

Илон Маск рекомендует:  settype - устанавливает тип переменной
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL