filesystemwatcher.waitforchanged العائدات، ولكن لا يزال هناك قفل على الملف

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

سؤال

لدي برنامج يقوم بإرسال مستند إلى برنامج تشغيل طابعة PDF وطباعة برنامج التشغيل إلى دليل معين. بعد الطباعة، أريد إرفاق ملف PDF إلى بريد إلكتروني (MailMessage) وإرساله.

الآن، أرسل المستند إلى الطابعة (ينتشر Wich عملية جديدة) ثم استدعاء filesystemWatcher.waitforchanged (waitforchangedresult.created) ولكن عند إنشاء الكائن، لا يزال لا يتم "الطباعة" وطابعة PDF لا تزال لديها قفل عليه، ورمي خطأ عند محاولة إرفاق هذا الملف إلى بريد إلكتروني.

  • لقد فكرت في خيط عادي. أطيب (2000) أو أيا كان، ولكن هذا أقل بكثير من المثالي.
  • لقد فكرت في وضع رمز المرفق في كتلة TRY / CATCH و LOOPING بشأن الفشل، ولكن مرة أخرى، هذا مجرد أخبار سيئة.

لا أستطيع التفكير حقا في حل أنيق.

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

المحلول

waitforchanges هو في انتظار الحدث الذي أنشأ كما كان لديك مشفرة. نظرا لأن المستند قيد الإنشاء، فاحصل على إخطار: هذا لا يعني أن الملف مكتوب بالكامل وقفل إزالته.

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

لقد قمت بالتحقق من تفريغ PDF الخاص بنا إلى رمز الدليل، ونحن نستخدم فقط waitforchanges لاكتشاف بدء تشغيل ملف جديد. ثم نستخدم جرب {} Catch {} حيث يتم إعادة المشاركة (الفشل في الحصول على الحقوق على الملف) المحاولة في قائمة الانتظار التي نحافظ عليها: كل محاولة "تخلف" لفترة أطول، لذلك المحاولة الأولى هي 1 ثانية بعد اكتشافنا الملف، والثاني هو 2 ثوان في وقت لاحق، ثم 4، 8، إلخ. هذا يقلل من إعادة إصدار الأرقام على الملفات الكبيرة مع الاستجابة إلى حد ما لملفات أقصر إلى حد ما.

نصائح أخرى

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

بخلاف ذلك أنا لست متأكدا مما يمكنك القيام به، لأن المراقب ليس لديه حدث "ملف مغلق" AFAIK.

AFAIK لا توجد طريقة للتحقق من أقفال الملفات دون معالجة الأخطاء.

هل تبدأ طابعة PDF بعملية جديدة ربما؟ ثم يجب أن تكون قادرا على مراقبة هذه العملية وعندما خرجت من ملفك سيتم إلغاء تأمين.

إذا كنت تستخدم Adobe's Acrobat لهذا الغرض، فيمكنك إنشاء PDF باستخدام Acrodist.exe (خارج الجزء العلوي من رأسي، فأنت تريد التبديل / n)، ثم انتظر العملية المنفجرة للخروج

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