【问题标题】:Test if disk has write access测试磁盘是否有写权限
【发布时间】:2010-10-18 20:09:33
【问题描述】:

我需要知道我的程序是否可以从它运行的位置将文件写入磁盘(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 会尝试写入应用程序的驱动器(只读的驱动器)?

【问题讨论】:

    标签: delphi disk


    【解决方案1】:

    调用 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;
    

    按预期工作。

    【讨论】:

      【解决方案2】:

      将代码放入 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】:

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

        【讨论】:

          【解决方案4】:

          不是很漂亮,但这似乎对我有用。


          
          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;
          

          【讨论】:

            猜你喜欢
            • 2020-06-01
            • 2010-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多