質問
私は私のプログラムは、それが実行されている場所からディスク(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」と戻り値をチェック