2009-04-10 42 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;