我需要知道我的程序是否可以从运行它的位置将文件写入磁盘(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会尝试写入应用程序的驱动器(只读它)?
调用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)
按预期工作.