テストディスクは、書き込みアクセス権を持っている場合

StackOverflow https://stackoverflow.com/questions/738856

  •  09-09-2019
  •  | 
  •  

質問

私は私のプログラムは、それが実行されている場所からディスク(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;

それでは、なぜMyPFileはWFileNameパラメータがある場合は、アプリケーションのドライブ(読み取り専用である1)への書き込みしようとしている「C:\ DocumentsとSettings \ BLA BLA」

役に立ちましたか?

解決

の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;

期待通りに動作します。

他のヒント

本当にかわいいが、これはない私のために動作するようです。

<時間>

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;
<時間>

あなたは試してみる/除い内にコードを入れるとどうなりますか?

また、あなたは、この(のようなもの)を試すことができます

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

申し訳ありませんが、私はもうDelphiでコーディングしないと、私はDelphiがどこにもインストールされていません。

「ドライブの準備ができて?」小さなフリーウェアが存在しますまた、チェックすることができホルスト・シェーファーによって書かれたユーティリティ( dready.comする)書き込みアクセスを。私はそれをテストしたが、私の知る限り、これは解決策として使用することができ見ることができるようにしていません。インスタンスのためにそれを呼び出す。「DREADY C:/ W」と戻り値をチェック

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top