سؤال

أحاول قفل ملف مع Java في بيئة Windows filelock. وحصلت على مشكلة: بعد أن أغفل الملف، لا يزال من الممكن الوصول إليها بواسطة عمليات أخرى على الأقل على المستوى.

المثال المثال التالي:

public class SimpleLockExample {
    public static void main(String[] args) throws Exception {
        String filename = "loremlipsum.txt";

        File file = new File(filename);
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        FileChannel channel = raf.getChannel();

        FileLock lock = null;
        try {
            lock = channel.tryLock();
            String firstLine = raf.readLine();
            System.out.println("First line of file : " + firstLine);
            waitForEnter();
            lock.release();
        } catch (OverlappingFileLockException e) {
            e.printStackTrace();
        }

        lock.release();
        System.out.println("Lock released");

        channel.close();
    }

    private static void waitForEnter() throws Exception {
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();
        reader.close();
    }
}

الآن، عندما أقفل ملفي باستخدام هذا المثال، يتم قفله:

  • لا يمكن حذفه بواسطة Windows
  • الكسوف يرفض فتحه

... لكنها لا تزال مقاومة للرصاص تماما:

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

هل هناك طريقة لمنع الملف بالكامل من الكتابة فوق / تطهيرها بواسطة عمليات أخرى مع Java في Windows؟

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

تم تشغيل هذا الاختبار مع نظام التشغيل Windows 2000.

br، touko.

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

المحلول

صعبة، و API Filelock نفسها لا يعد كثيرا:

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

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

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

أتساءل عما إذا كان ما يحدث ذلك لأن المحرر الخاص بك ليس تعديل الملف كإنشاء ملف مؤقت ثم معالجة إدخالات الدليل من أجل إعادة إدخال إصدار الملف الذي قمت بتأمينه بإصدار جديد. هل يسمح Windows بهذا السلوك؟

أتساءل عما إذا كنت ستحتاج إلى اللجوء إلى JNI من أجل الحصول على مستوى التحكم الذي تحتاجه.

نصائح أخرى

مكالمتك إلى. حاول () قد تعود فارغة إذا لم تحصل على القفل. من الجافادوك:

كائن قفل يمثل القفل المكتسب حديثا، أو لاغيا إذا تعذر الحصول على القفل لأن برنامج آخر يحمل قفل متداخلا

أيضا، يفتح الرمز الخاص بك حاليا الملف وثم يحاول الحصول على قفل. بدلا من ذلك، يجب عليك حلقة محاولة الحصول على القفل، وبمجرد حصولك، افتح الملف، اقرأ الملف، إغلاق الملف، ثم التخلي عن القفل. والتخلي عن القفل في finally {} جملة، فقط في حالة ترميز التعليمات البرمجية استثناء مع القفل الذي عقد. (كان على الإطلاق لإعادة تشغيل جهاز Windows لمجرد أن تم تأمين بعض الملفات؟)

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