Вы можете использовать функцию CreateFile для проверки доступа к файлу из вашего потока.
Что сказано в Документах:
Создает или открывает файл или устройство ввода-вывода.<..> Функция возвращает дескриптор, который можно использовать для доступа к файлу или устройству для различных типов ввода / вывода в зависимости от файла или устройства и указанных флагов и атрибутов.
Давайте напишем некоторый код:
procedure Button1Click(Sender: TObject);
var
FileName: String;
FileHandle: THandle;
Flags: Cardinal;
LastError: Cardinal;
TextErrorCode: PChar;
procedure DisplayNotification;
begin
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or
FORMAT_MESSAGE_FROM_SYSTEM,
nil, LastError, LANG_USER_DEFAULT,
@TextErrorCode, 0, nil
);
ShowMessage(TextErrorCode);
LocalFree(HLOCAL(TextErrorCode));
end;
begin
FileName := 'YourPath + YourFileName';
Flags := GetFileAttributes(PChar(FileName));
if Flags <> INVALID_FILE_ATTRIBUTES then
begin
if (faDirectory and Flags) <> faDirectory then
begin
FileHandle := CreateFile(PChar(FileName),
GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, 0, 0
);
LastError := GetLastError;
try
if FileHandle <> INVALID_HANDLE_VALUE then
begin
// Execute you backup code
end;
finally
CloseHandle(FileHandle);
end;
// Notify user about problems with opening the file
if FileHandle = INVALID_HANDLE_VALUE then
DisplayNotification;
end
else
// Notification about specified filename defines a directory not a single file
end
else
begin
// Notify user if there is a problem with getting file's attributes
LastError := GetLastError;
DisplayNotification;
end;
end;
Теперь вы можете проверить, занят ли файл другим процессом, а если нет, тогда сделайте свой код для резервного копирования открытого файла.
Полезные ссылки:
- Функция GetFileAttributes
- Функция FormatMessage