我需要知道我的程序是否可以将文件从磁盘运行的位置写入磁盘(HDD,软盘,闪存,CD)。 我尝试过类似的东西:
{$I-}
Rewrite(myFile);
{$I+}
Result:= (IOResult = 0);
问题是如果磁盘是只读的,Windows会给我一条错误消息,告诉我
“appName.exe - 写保护错误磁盘无法写入,因为它是写保护的。请从卷中删除写保护 USB_BOOT在驱动器D:。取消TryAgain继续“
如何在不引发任何错误/警告消息的情况下测试写入权限? 感谢。
编辑:
确定。 “bug”与上面提到的代码无关。我只觉得它出现在那里。我将代码移动到只读磁盘并从那里运行它。该错误出现在名为“CreateShortcutEx”的函数中,在此行中:
MyPFile.Save(PWChar(WFileName),False);
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;
那么,如果WFileName参数为“C:\ documents and settings \ bla bla”,为什么MyPFile会尝试写入应用程序的驱动器(只读它)?
答案 0 :(得分: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;
按预期工作。
答案 1 :(得分:1)
不是很漂亮,但这似乎对我有用。
function CanWrite(drive: string): boolean;
var
OldMode: Cardinal;
begin
OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
with TStringList.Create do
try
SaveToFile(drive + ':\file.txt');
result := true;
try
deletefile(drive + ':\file.txt');
except
end;
except
result := false;
end;
finally
SetErrorMode(OldMode);
end;
end;
使用
调用它
if CanWrite('g') = true then
begin
showmessage('Can Write');
end
else
begin
showmessage('Can not write');
end;
答案 2 :(得分:0)
将代码放入try / except?
时会发生什么?此外,您可以尝试(类似)这个:
function CanWrite: boolean;
begin
result := true;
with TStringList.Create do
try
SaveToFile('file.txt');
except
result := false;
finally
Free;
end;
end;
很抱歉,我不再使用Delphi编写代码,而且我没有在任何地方安装Delphi。
答案 3 :(得分:0)
存在一个小型免费软件“Drive ready?” Horst Schaeffer编写的实用程序(dready.com)也可以检查写访问权限。我没有测试过,但据我所知,这可以用作解决方案;例如将其称为“DREADY C:/ W”并检查返回值。