2009-04-10 10 views
1

私のプログラムが実行中のディスク(HDD、フロッピー、フラッシュ、CD)にファイルを書き込むことができるかどうかを知る必要があります。 私が何か試してみました:問題は、ディスクが読み取り専用されている場合、Windowsは私に私にそのディスクに書き込みアクセスがあるかどうかのテスト

「がappname.exe伝えるエラーメッセージ与えることである

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

を - ライトプロテクトエラーディスクは、それがライトプロテクトされているために書き込むことができません。ドライブDにボリューム USB_BOOTから書き込み保護を削除してください:。「私はとの書き込みアクセスをテストするにはどうすればよい

を続行TRYAGAINキャンセルエラー/警告メッセージが表示されますか?おかげさまで


編集:

[OK]をクリックします。 「バグ」は、上記のコードとは何の関係もありません。私はそれがそこに現れると思った。私は、コードを読み取り専用のディスクに移動し、そこから実行しました。バグは、この行に、「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は、アプリケーションのドライブへの書き込みしようとしている(1 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

作品とそれに


 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; 

コール。 – Ampere

+0

エラーモードを復元する必要があります。私はそれに応じてコードを修正しました。 – gabr

+0

@ gabr:もちろん、これを修正してくれてありがとう。 – mghie

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がどこにもインストールされていません。

0

小さなフリーウェア「ドライブレディ」がありますか? Horst Schaefferによって書かれたユーティリティ(dready.com)も書き込みアクセスをチェックできる。私はそれをテストしていませんが、私が見る限り、これは解決策として使用できます。それを例えば "DREADY C:/ W"と呼び、戻り値を確認してください。

1

これは本当にかわいいですが、これは私にとってはうまくいくようです。今も私のために



if CanWrite('g') = true then 
    begin 
     showmessage('Can Write'); 
    end 
    else 
    begin 
     showmessage('Can not write'); 
end; 

関連する問題