На самом деле запись в каталог - это самый простой способ определить, доступен ли каталог для записи.Слишком много вариантов безопасности доступно для индивидуальной проверки, и даже в этом случае вы можете что-то пропустить.
Вам также необходимо закрыть открытый дескриптор перед вызовом DeleteFile()
.В любом случае вам не нужно звонить, поскольку вы используете флаг FILE_FLAG_DELETE_ON_CLOSE
.
Кстати, в вашем коде есть небольшая ошибка.Вы создаете временный String
и присваиваете ему PWideChar
, но String
выходит из области видимости, освобождая память, до фактического использования PWideChar
.Ваша переменная FileName
должна быть String
вместо PWideChar
.Выполните приведение типа при вызове CreateFile()
, не раньше.
Попробуйте это:
function IsDirectoryWriteable(const AName: string): Boolean;
var
FileName: String;
H: THandle;
begin
FileName := IncludeTrailingPathDelimiter(AName) + 'chk.tmp';
H := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil,
CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0);
Result := H <> INVALID_HANDLE_VALUE;
if Result then CloseHandle(H);
end;