كيفية بأمان تحديث ملف يحتوي على العديد من القراء و واحد كاتب ؟

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

سؤال

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

كيف يمكنني التأكد من أن:

  1. إذا كان يكتب فشل هذا الملف السابق لا تزال قابلة للقراءة
  2. القراء لا يمكن أن تصمد في واحد كاتب

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

nio هو FileLock تعمل فقط مع نفس JVM ، لذلك فمن غير مجدية بالنسبة لي.

كيف يمكنني بأمان تحديث الملف مع العديد من القراء باستخدام جافا ؟

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

المحلول

وفقا جافادوك:

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

نصائح أخرى

أنا لا أعرف إذا كان هذا هو المعمول به ، ولكن إذا كنت تقوم بتشغيل في محض Vista/Windows Server 2008 الحل, وأود أن استخدام TxF (المعاملات NTFS) ثم تأكد من فتح الملف والتعامل مع تنفيذ عمليات الملف عن طريق استدعاء الملف المناسب من خلال واجهات برمجة التطبيقات JNI.

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

على نظام يونكس ، أود إزالة الملف ثم فتحه للكتابة.أي شخص الذي كان مفتوحا على القراءة سوف لا تزال ترى العمر واحد و بمجرد أن أغلقت وستنتهى من نظام الملفات.أنا لا أعرف إذا كان NTFS له دلالات مماثلة, على الرغم من أنني سمعت أنه losely على أساس BSD نظام الملفات لذلك ربما لا.

شيء ينبغي أن تعمل دائما, بغض النظر عن ما هو نظام التشغيل وما إلى ذلك ، تم تغيير برنامج العميل.

إذا كان هذا هو خيار ، ثم هل يمكن أن يكون ملف "settings1.ini" و إذا كنت ترغب في تغيير ذلك ، يمكنك إنشاء ملف "settings2.ini.الانتظار" ، ثم كتابة الأشياء الخاصة بك ثم قم بإعادة تسميته إلى "settings2.ini" ثم حذف "settings1.ini".

الخاص بك تغيير برنامج العميل ببساطة دائما التحقق من settings2.ini إذا كان قد قرأ settings1.ini الماضي ، والعكس بالعكس.

بهذه الطريقة يكون لديك دائما نسخة العمل.

قد تكون هناك حاجة إلى تأمين.أنا لم تكن مألوفة جدا مع FS API في ويندوز ، ولكن كما NTFS يدعم كلا من الصعب الروابط و لينة الروابط AFAIK, يمكنك أن تجرب هذا إذا كان الإعداد الخاص بك يسمح بذلك:

استخدام من الصعب أو لينة رابط النقطة الفعلية الملف و اسم الملف diferently.دعونا الجميع الوصول إلى الملف باستخدام الرابط اسم.

كتابة ملف جديد تحت اسم مختلف في نفس المجلد.

بمجرد الانتهاء من ذلك ، يكون ملف أشر إلى الملف الجديد.على النحو الأمثل ، Windows تسمح لك لإنشاء ارتباط جديد مع استبدال الوصلة في عملية الذرية.ثم كنت على نحو فعال من الرابط دائما تحديد ملف صالح ، سواء القديم أو الجديد.في أسوأ الأحوال, يجب حذف القديم اولا ثم إنشاء ارتباط إلى الملف الجديد.في هذه الحالة سيكون هناك فترة زمنية قصيرة في البرنامج لن يكون قادرا على تحديد موقع الملف.(أيضا, نظام التشغيل Mac OS X يقدم "ExchangeObjects" وظيفة تسمح لك مبادلة اثنين من عناصر الذرة - ربما ويندوز يقدم شيئا من هذا القبيل).

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

أنا لا أعرف, لكن, كيفية إنشاء الارتباطات في جافا.ربما لديك لاستخدام بعض native API من أجل ذلك.

آمل أن يساعد هذا على أي حال.

لقد تم التعامل مع شيء من هذا القبيل في الآونة الأخيرة.إذا كنت تقوم بتشغيل جافا 5, ربما يمكنك أن تنظر في استخدام NIO أقفال الملف بالتزامن مع ReentrantReadWriteLock?تأكد من أن كل رمز الرجوع FileChannel وجوه أيضا مراجع ReentrantReadWriteLock.هذه الطريقة NIO الأقفال في كل VM المستوى حين عودة الدخول قفل أقفال على مستوى الموضوع.

FileLock fileLock = filechannel.lock(position, size, shared);
reentrantReadWriteLock.lock();

// do stuff

fileLock.release();
reentrantReadWriteLock.unlock();

من خلال التعامل مع استثناء أن تكون مطلوبة.

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