测试磁盘是否具有写访问权限

WeG*_*ars 1 delphi disk

我需要知道我的程序是否可以从运行它的位置将文件写入磁盘(HDD,软盘,闪存,CD).我尝试过类似的东西:

     {$I-}
     Rewrite(myFile);                                       
     {$I+}
  Result:= (IOResult = 0);
Run Code Online (Sandbox Code Playgroud)

问题是如果磁盘是只读的,Windows会给我一条错误消息告诉我

"appName.exe - 写保护错误磁盘无法写入,因为它是写保护的.请从驱动器D:中的卷USB_BOOT中删除写保护.取消TryAgain继续"

如何在不引发任何错误/警告消息的情况下测试写入权限?谢谢.


编辑:

好."bug"与上面提到的代码无关.我只觉得它出现在那里.我将代码移动到只读磁盘并从那里运行它.该错误出现在名为"CreateShortcutEx"的函数中,在此行中:

 MyPFile.Save(PWChar(WFileName),False);
Run Code Online (Sandbox Code Playgroud)

MyPFile声明如下:

var
 MyObject  : IUnknown;
 MySLink   : IShellLink;
 MyPFile   : IPersistFile;
 Directory : String;
 WFileName : WideString;
 MyReg     : TRegIniFile;
begin
 MyObject := CreateComObject(CLSID_ShellLink);
 MySLink  := MyObject as IShellLink;
 MyPFile  := MyObject as IPersistFile;
 .....
end;
Run Code Online (Sandbox Code Playgroud)

那么,如果WFileName参数是"C:\ documents and settings\bla bla",为什么MyPFile会尝试写入应用程序的驱动器(只读它)?

mgh*_*hie 7

调用Windows API SetErrorMode()函数以禁用错误消息框.

编辑:

我刚试过,这个:

procedure TForm1.Button1Click(Sender: TObject);
var
  Str: TStream;
  OldMode: Cardinal;
begin
  OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);

  try
    try
      Str := TFileStream.Create('z:\foo.txt', fmOpenReadWrite);
      try

      finally
        Str.Free;
      end;
    except end;
  finally
    SetErrorMode(OldMode);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

按预期工作.