Проверьте, есть ли у диска доступ для записи - PullRequest
1 голос
/ 11 апреля 2009

Мне нужно знать, может ли моя программа записывать файлы на диск (HDD, дискета, флэш-диск, CD), с которого она работает. Я пробовал что-то вроде:

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

Проблема в том, что если диск только для чтения, Windows выдает сообщение об ошибке, сообщающее, что

"appName.exe - Ошибка защиты от записи. Диск не может быть записан, так как он защищен от записи. Снимите защиту от записи с тома USB_BOOT на диске D :. Отмена TryAgain Continue "

Как я могу проверить доступ на запись без каких-либо сообщений об ошибках или предупреждений? Благодаря.


Edit:

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 имеет значение «C: \ documents and settings \ bla bla»?

Ответы [ 4 ]

7 голосов
/ 11 апреля 2009

Вызовите Windows API SetErrorMode () , чтобы отключить окно сообщения об ошибке.

Edit:

Я только что попробовал, и это:

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 голос
/ 24 августа 2010

Не очень красиво, но мне кажется, это работает.



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;

0 голосов
/ 11 апреля 2009

Существует небольшое бесплатное программное обеспечение "Drive ready?" утилита ( dready.com ), написанная Хорстом Шеффером, которая также может проверять доступ на запись. Я не проверял это, но, насколько я понимаю, это можно использовать в качестве решения; например, назовите его «DREADY C: / W» и проверьте возвращаемое значение.

0 голосов
/ 11 апреля 2009

Что происходит, когда вы помещаете свой код в попытку / исключение?

Кроме того, вы можете попробовать (что-то вроде) это:

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

Извините, но я больше не пишу в Delphi, и Delphi нигде не установлен.

...