اختبار إذا كان القرص لديه وصول الكتابة

StackOverflow https://stackoverflow.com/questions/738856

  •  09-09-2019
  •  | 
  •  

سؤال

أحتاج إلى معرفة ما إذا كان برنامجي يمكنه كتابة الملفات إلى القرص (HDD، قرص مرن، فلاش، CD) من حيث يتم تشغيله. لقد حاولت شيئا مثل:

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

المشكلة هي أنه إذا كان القرص للقراءة فقط، فإن Windows يعطيني رسالة خطأ تخبرني بذلك

"appname.exe - اكتب خطأ حماية القرص لا يمكن كتابته لأنه يتم محمي الكتابة. يرجى إزالة حماية الكتابة من وحدة التخزين USB_BOOT في محرك الأقراص D :. إلغاء TRYAGAIN متابعة"

كيف يمكنني اختبار الوصول للكتابة دون رفع أي رسائل خطأ / تحذير؟ شكرا.


يحرر:

نعم. "الخطأ" لا علاقة له بالقطعة المذكورة أعلاه. اعتقدت فقط أنه يبدو هناك. حرك الرمز إلى القرص للقراءة فقط وأخرجه من هناك. يظهر الخطأ في وظيفة تسمى "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"؟

هل كانت مفيدة؟

المحلول

استدعاء ويندوز 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 في أي مكان.

هناك وجود برامج مجانية صغيرة "حملة جاهزة؟" جدوى (dready.com.) كتبها Horst Schaeffer التي يمكن أيضا التحقق من الوصول إلى الكتابة. لم أختبرها ولكن بقدر ما أستطيع أن أرى ذلك يمكن استخدامها كحل؛ نسميها على سبيل المثال باسم "Diready C: / W" وتحقق من قيمة الإرجاع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top