2009-04-10 74 views
1

我需要知道我的程序是否可以将文件写入磁盘(硬盘,软盘,闪存,CD)中。 我已经试过类似:测试磁盘是否具有写入权限

 {$I-} 
    Rewrite(myFile);          
    {$I+} 
    Result:= (IOResult = 0); 

的问题是,如果是只读磁盘时,Windows给我一个错误信息,告诉我,

“appName.exe - 写保护错误磁盘不能写,因为它是写保护,请在驱动器d体积 USB_BOOT去掉写保护:.取消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; 

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

回答

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; 

按预期工作。

+0

对我的作品现在也。 – Ampere 2009-04-10 21:42:36

0

将代码放入try/except时会发生什么?

此外,您还可以尝试(像)这样的:

function CanWrite: boolean; 
begin 
    result := true; 
    with TStringList.Create do 
    try 
    SaveToFile('file.txt'); 
    except 
    result := false; 
    finally 
    Free; 
    end; 
end; 

很抱歉,但我在德尔福不编码了,我没有地方安装德尔福。

0

存在一个小的免费软件“Drive ready?”由Horst Schaeffer编写的实用程序(dready.com)也可以检查写入权限。我还没有测试过,但据我所知,这可以用作解决方案;将其称为“DREADY C:/ W”并检查返回值。

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;