1

我需要知道我的程序是否可以从它运行的位置将文件写入磁盘(HDD、软盘、闪存、CD)。我试过类似的东西:

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

问题是,如果磁盘是只读的,Windows 会给我一条错误消息,告诉我

“appName.exe - 写保护错误磁盘无法写入,因为它被写保护。请从驱动器 D: 中的卷 USB_BOOT 中删除写保护。取消 TryAgain Continue”

如何在不引发任何错误/警告消息的情况下测试写访问?谢谢。


编辑:

行。“错误”与上述代码无关。我只以为它出现在那里。我将代码移动到只读磁盘并从那里运行它。该错误出现在名为“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

当您将代码放入 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 回答
0

有一个小的免费软件“驱动器准备好了吗?” 由 Horst Schaeffer 编写的实用程序 ( dready.com ),它也可以检查写访问。我尚未对其进行测试,但据我所知,这可以用作解决方案;例如将其称为“DREADY C: /W”并检查返回值。

于 2009-04-10T22:29:04.117 回答