1

プログラムが実行中の場所からディスク (HDD、フロッピー、フラッシュ、CD) にファイルを書き込めるかどうかを知る必要があります。私は次のようなことを試しました:

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

問題は、ディスクが読み取り専用の場合、Windows から次のようなエラー メッセージが表示されることです。

「appName.exe - 書き込み保護エラー ディスクは書き込み保護されているため、書き込みできません。ドライブ 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;

では、WFileName パラメータが "C:\documents and settings\bla bla" の場合、MyPFile がアプリケーションのドライブ (読み取り専用のドライブ) に書き込もうとするのはなぜですか?

4

4 に答える 4

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;

期待どおりに動作します。

于 2009-04-10T21:08:52.530 に答える
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;

于 2010-08-24T15:12:20.297 に答える
0

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

于 2009-04-10T22:29:04.117 に答える
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 をインストールしていません。

于 2009-04-10T21:22:46.693 に答える