测试磁盘是否具有写访问权限

时间:2009-04-10 21:01:33

标签: delphi disk

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

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

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

  

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

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


编辑:

确定。 “bug”与上面提到的代码无关。我只觉得它出现在那里。我将代码移动到只读磁盘并从那里运行它。该错误出现在名为“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 个答案:

答案 0 :(得分: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;

按预期工作。

答案 1 :(得分: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;

答案 2 :(得分: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。

答案 3 :(得分:0)

存在一个小型免费软件“Drive ready?” Horst Schaeffer编写的实用程序(dready.com)也可以检查写访问权限。我没有测试过,但据我所知,这可以用作解决方案;例如将其称为“DREADY C:/ W”并检查返回值。