سؤال

من الممكن فتح ملف نصي وقراءة المحتويات بينما يقوم تطبيق آخر بتحديث الملف، وبهذه الطريقة التي لا تسبب تعارض قفل؟

أحتاج إلى مراقبة ملف سجل من تطبيق واحد يتم تحديثه بواسطة تطبيق آخر في كل مرة يحدث حدث.

أفعل التحقق مما إذا كان الملف قيد الاستخدام قبل أن أحاول قراءته، لكن هذا لا يبدو يعمل في جميع الحالات.

شكرا، بيتر

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

المحلول

ذلك يعتمد على كيفية فتح التطبيق الأول هذا الملف.

أي عند استدعاء API CreateFile لفتح ملف، هناك Param Dwsharemode التي تحدد API كيفية فتحه (إذا تم إعطاء هذا 0، لا يمكن الوصول إليه من تطبيقات أخرى IIRC). وإلا يجب أن تكون هناك مشكلة في القراءة من هذا الملف. إذا لم أخطأ، للتحقق مما إذا كان هذا الملف مفتوح للقراءة فقط، يمكنك استدعاء شيء مثل

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;

نصائح أخرى

  1. تحميل مراقب العملية من sysinternals.
  2. افتح مربع حوار المرشح وإضافة عامل تصفية "مسار" لملف السجل الخاص بك.
  3. بدء تشغيل تطبيق كتابة السجل (سأتصل بهذا "LogWriter").
  4. ابحث عن وانقر فوق الحدث الذي يقوم فيه بتسجيل الدخول إلى CreateFile.
  5. تحت "التفاصيل"، يجب أن يكون "الوصول المطلوب: الكتابة العامة". وينبغي أن يكون لها "Sharemode: قراءة"، والتي تتوافق مع FILE_SHARE_READ في دعوة إلى CreateFile. ما يعنيه هو، "أنا، LogWriter، سمح للآخرين اقرأ ملفي".
  6. الآن قم بتشغيل تطبيق قراءة السجل الخاص بك ("logreader")، ويفعل نفس التمرين.
  7. يجب أن يكون التفاصيل "الوصول المطلوب: قراءة عامة". وينبغي أن يكون لديه "Sharemode: القراءة والكتابة"، مما يعني "I، Logreader، سمح للآخرين، بما في ذلك LogWriter، للقراءة والكتابة إلى ملف السجل".

هذه هي القيم الأكثر عقلانية، وأعتقد، وسوف يمنعون القفل. قد تكون مجموعات أخرى مسموح بها. هناك هو الجدول هنا.

الآن، لم تقل ما يحدث عندما "لا يبدو أنه يعمل في جميع الحالات". ما يجب القيام به بعد ذلك سوف يعتمد حقا على التفاصيل. نأمل أن ما ورد أعلاه سوف يمنحك معلومات كافية للعمل ما الذي يحدث خطأ.

لن تحصل على صراع قفل لأن تطبيق الكتابة من غير المرجح أن يكون قد أغلق الملف. القيام بما تقترحه بشكل عام يعمل دون مشاكل (هذا هو ما unix ذيل -f. يمكن تجاهل الأمر) وتلك الموجات الخلل الثانوية التي تحدث تحدث. لقد كتبت بضع تطبيقات مراقبة سجل في الماضي الذي عملت مثل هذا، دون أي مشاكل.

جرب استخدام filesystemwatcher. للحصول على الأحداث عند تحديث ملف.

أكثر ودية دلفي حلقة الوصل

بصرف النظر عن الحصول على مشاركة الملفات للعمل الصحيح، قد يكون من المستحيل اعتمادا على ما طلبات البرنامج الأخرى، سيقوم بعض البرامج بإغلاق الملف بين الوصول.

لقد كان لدي نجاح في الماضي مع برنامجي في انتظار الملف ليصبح متاحا، ثم فتحه بسرعة، الاستيلاء على البيانات اللازمة وإغلاقه. على الأقل في DOS محاولة الوصول إلى ملف مغلق تسبب بعض إعادة المحاولة، وأصبحت هذا الإعداد، بحيث إذا حاول البرنامج الآخر للملف أثناء قيامك بالتأخر ببساطة ولا أرى خطأ.

كنت قادرا على تحديث الملف (قمت بالتأكيد ليس لإغلاقها بين!) دون البرنامج الآخر معرفة شيء.

قبيح كما الخطيئة ولكن لم نتمكن من تغيير البرنامج الآخر لذلك كانت الطريقة الوحيدة للحصول على المهمة المنجزة. تم نشره في المنزل لسنوات، لم أسمع أبدا زقزقة من مستخدمي هذا النظام. أخيرا ذهب بعيدا عندما تقاعد الآلية التي تسيطر عليها البرنامج الآخر.

ستقوم XPolog بالخدعة دون تغيير ENV أو رمزك، XPolog Log Monitor

Avar هو الصحيح - أنت في رحمة برنامج الكتابة هنا. إذا كانوا قفل الملف، فهناك بضعة أشياء يمكنك القيام بها:

1 - تحقق من تغيير في وقت تاريخ "آخر تعديل" - إذا كان هذا التغييرات، فأنت تعرف شيئا ما لقد حدث.

2 - إذا تغيرت DateTime Mod، ثم (اعتمادا على حجم الملف) قد تكون جيدة بما يكفي لإنشاء نسخة من الملف والتحقق الذي - التي.

نحن نستخدم "الذيل ل Win32"،

أعرف أنه ليس دلفي ولكن قد يكون مفيدا

http://tailforwin32.sourceforge.net/

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