كيفية تجنب استثناء Filenotfound عند تشغيل Java على Linux بسبب حساسية الحالة؟

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

سؤال

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

المشكلة الحقيقية الآن هل أحصل FileNotFoundException عندما يحاول رمز Java فتح ملف يقول Abc.txt عندما فقط abc.txt موجود. :(

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

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

المحلول

لا توجد وسيلة لتجنب هذا كما java.io.File API يعتمد على النظام. يجب عليك استخدام الحالة المناسبة عند معالجة الملفات على Linux / Unix. في الواقع، سيكون نصيحتي / الحل هو اتباع الاتفاقيات الصارمة والمحطة المحمولة أثناء التنمية على Windows (مثل استخدام أسماء الملفات الصغيرة فقط أو، أفضل، استخدم اسم الملف بالضبط عند الوصول إليه برمجيا). أن نكون صادقين، أنا لا أفهم لماذا تحاول التحميل Abc.txt عندما يكون اسم الملف abc.txt. وبعد هذه هي عادة سيئة (تدرسها قضاء الكثير من الوقت على Windows) بدلا من مشكلة Linux / UNIX.

نصائح أخرى

اصلحه!

أي مخطط الذي تقوم بإبداعه للتحايل على إصلاحه سيكون أسوأ في المدى الطويل.

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

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

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

على افتراض أن الملفات هي حالة مختلطة على Linux، لا توجد إجابة بسيطة على هذا.

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

المشكلة مع هذا هو أنه (وبالفعل التطبيق الخاص بك) لا يمكن التعامل مع القضية حيث لديك (قل) "foo.txt" و "foo.txt" في نفس دليل Linux.

ولكن أفضل حل هو تغيير طلبك بحيث يعمل مع أسماء الحالات الحساسة لحالة الأحرف.

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

ليس من الواضح من سؤالك ما الذي يسبب تغيير الحالة في ملفاتك. إذا كانت جميع ملفاتك صغيرة في Linux، في حين أنها حالة مختلطة على Windows، فيمكنك فقط تحويل اسم الملف إلى حالة صغيرة، مثل ذلك:

new File(filename.toLowerCase())

هناك حل يحتوي على أداء رهيب وقت التشغيل ولكنه بسيط للغاية في تنفيذ:

يحل محل new FileReader(name) مع شيء مثل

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

لم أعمل هذا الرمز، قد يكون لها الأخطاء المطبعية والأخطاء. أتركهم لك لإصلاح.

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