سؤال

لدي ماكرو JEdit (BeanShell) الذي يفتح ملفًا محددًا ثم يحفظ الملف على الفور في مجلد c: emp الخاص بي (حتى لا أقوم بتحديث الملف الحقيقي عن طريق الخطأ).

إليك رمز قشرة الفول:

logFilePath = "c:\\temp\\aj.txt";
jEdit.openFile( view , logFilePath );
_buffer = jEdit.getBuffer(logFilePath);
_buffer.save(view,"c:\\temp\\backup.txt",true);

هذا يعطيني الخطأ التالي:

I/O Error
Each buffer can only execute one input/output operation at a time.  
Please wait until the current operation finishes 
(or abort it in the I/O progress monitor) before starting another one.  

لقد حاولت إضافة حلقة while للانتظار حتى buffer.isLoaded() هذا صحيح، ولكن هذا يذهب فقط إلى حلقة لا نهاية لها.
ما يبدو أنه يعمل هو ظهور مربع رسالة ( Macros.message ).ومع ذلك، أنا حقًا لا أريد إجراء هذا الحوار غير الضروري.

أنا لا أعرف الكثير من جافا، لذا من فضلك أخبرني إذا كنت أرتكب خطأً مبتدئًا.

تحديث:

أضفت إجابتي الخاصة لإظهار الكود المشار إليه من إجابة سيرهي.

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

المحلول

ويمكنك محاولة هذا الحل ، داعيا VFSManager.waitForRequests();.

نصائح أخرى

هذا يعمل

وهذا هو أوضح رمز من قبل Serhii في الإجابة أو فوق .

إضافة VFSManager.waitForRequests(); بعد الأمر jEdit.openFile() .

كود الكامل

logFilePath = "c:\\temp\\aj.txt";
jEdit.openFile( view , logFilePath );

VFSManager.waitForRequests();

/* 
    VFSManager.waitForRequests();

    jEdit waits then for the file to be completely loaded before continuing 
    ... It's designed for waiting on all 'pending I/O requests'".
*/

_buffer = jEdit.getBuffer(logFilePath);
_buffer.save(view,"c:\\temp\\backup.txt",true);

يمكنك أيضًا القيام بذلك بشكل أقل جرأة.

  1. استخدم القيمة المرجعة لـ jEdit.openFile()، وهذا هو المخزن المؤقت بالفعل، ولا حاجة إلى getBuffer()
  2. لا تتصل بـ VFSManager.waitForRequests() الذي ينتظر تنفيذ جميع الطلبات، ولكن ببساطة أضف BufferListener إلى Buffer الذي حصلت عليه من jEdit.openFile() وقم بإجراء مكالمة الحفظ في طريقة bufferLoaded لهذا المستمع :-)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top