سؤال

هل هناك طريقة للتحقق مما إذا كان الملف قد تم فتحه بواسطة 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')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top