سؤال
هل هناك طريقة للتحقق مما إذا كان الملف قد تم فتحه بواسطة ReWrite في دلفي؟
رمز سوف يذهب شيء من هذا القبيل:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
المحلول
يمكنك الحصول على وضع الملف.(لحظة واحدة، سأقوم بإنشاء مثال).
يمنحك TTextRec(txt).Mode الوضع:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
ابحث عن TTextRec في وحدة النظام لمزيد من المعلومات.
نصائح أخرى
جرب هذا:
function IsFileInUse(fName: string) : boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(fName) then begin
Exit;
end;
HFileRes := CreateFile(PChar(fName)
,GENERIC_READ or GENERIC_WRITE
,0
,nil
,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL
,0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not(Result) then begin
CloseHandle(HFileRes);
end;
end;
هذا يعمل بشكل جيد:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
لقد وجدت أنه من الأسهل الاحتفاظ بمتغير منطقي كرفيق؛مثال: bFileIsOpen
.أينما يتم فتح الملف، قم بتعيين bFileIsOpen := true
وبعد ذلك، عندما تريد معرفة ما إذا كان الملف مفتوحًا، فما عليك سوى اختبار هذا المتغير؛مثال: if (bFileIsOpen) then Close(datafile);
إجابة جوزيف تعمل بشكل مثالي - لقد قمت باستدعاء الوظيفة filenotopen
وغيرت الخط إذا
Result := (HFileRes = INVALID_HANDLE_VALUE);
ل
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
لقد قمت أيضًا بإزالة السطر "إذا لم يكن (النتيجة) ثم ابدأ" (و "النهاية") بحيث يغلق دائمًا المقبض أو المهام اللاحقة وتعطي القراءات أخطاء
أنا الآن أسميها مثل هذا
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')