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