Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разница в атрибутах при уничтожении объекта.


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо