![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разница в атрибутах при уничтожении объекта.
Riply © (2007-11-10 01:40:00)Здравствуйте !
Реализация функций DeleteFile и RemoveDirectory очень похожи.
В обоих случаях используется NtCreateFile.
Но кроме логичных отличий в параметрах, есть разница в "SHARE" параметре.
Для DeleteFile ShareAccess устанавливается
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
а для RemoveDirectory - ноль.
Поясните, пожалуйста, чем это обусловлено.
guav (2007-11-11 13:57:00) [21]> а для RemoveDirectory - ноль.
На основании чего был сделан такой вывод ?
Я считаю что успешное выполнение нижеследующего кода опровергает этот вывод.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
function OemSysErrorMessage(Error: Integer): string;
var S: string;
begin
S := SysErrorMessage(Error);
SetLength(Result, Length(S));
AnsiToOem(PChar(S), PChar(Result));
end;
var hFile, hFile1: THandle;
const sTestDir = 'D:\test1';
begin
// Create an empty folder.
if not CreateDirectory(sTestDir, nil) then
begin
WriteLn('Unable to create test dir, error ', GetLastError());
WriteLn(OemSysErrorMessage(GetLastError()));
ReadLn;
Exit;
end;
// Open the folder with read and write access.
hFile := CreateFile(
sTestDir,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil,
OPEN_ALWAYS,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if INVALID_HANDLE_VALUE = hFile then
begin
WriteLn('Cannot open directory, error ', GetLastError());
WriteLn(OemSysErrorMessage(GetLastError()));
ReadLn;
Exit;
end;
// Open the folder again with exclusive share mode.
// As it is already open with read and write access,
// this should fail.
hFile1 := CreateFile(
sTestDir,
GENERIC_READ,
0,
nil,
OPEN_ALWAYS,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if INVALID_HANDLE_VALUE = hFile1 then
begin
WriteLn('Cannot open directory, error ', GetLastError());
WriteLn(OemSysErrorMessage(GetLastError()));
end;
try
// Mark the folder for deletion.
// As this succeedes, at least FILE_SHARE_READ and FILE_SHARE_WRITE
// flags are specified inside the RemoveDirectory function.
if not RemoveDirectory(sTestDir) then
begin
WriteLn('Cannot remove directory, error ', GetLastError());
WriteLn(OemSysErrorMessage(GetLastError()));
ReadLn;
Exit;
end;
WriteLn('The directory still exists');
WriteLn('Press any key...');
ReadLn;
finally
CloseHandle(hFile);
end;
WriteLn('Now it does not');
WriteLn('Press any key...');
ReadLn;
end.