سؤال

أواجه هذه المشكلة الغريبة.

أحاول قراءة ملف موجود في جهاز آخر كمورد مشترك:

\\remote-machine\dir\MyFileHere.txt

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

على الرغم من أنني سأحصل على نوع من الأذونات، لذلك أقوم بتعيين المورد كمحرك أقراص:ك:\

أعد تشغيل ملف جافا الخاص بي، يقرأ، حسنًا.

أعد تشغيل ملف جافا الخاص بي داخل "المحرك" -> FileNotFoundException.

عندما أقوم بنسخ الملف إلى الجهاز المحلي ( C:\MyFileHere.txt ) لم يتم طرح أي استثناء.

سؤال

ما الذي قد يسبب هذا FileNotFoundExcecption؟

أنا أستخدم جافا 1.5

بقدر ما أعرف، يستخدم المحرك جافا إلى حد كبير بشفافية.

وقد واجه أي شخص شيئا مماثلا؟

سؤال إضافي؟ما هو النهج الجيد للحل البديل لهذا؟لقد بدأت أفكر في تثبيت Tomcat الذي يخدم هذه الملفات ويقرأها من خلال http، لكنني أعتقد أن هذا كثير جدًا، ولهذا السبب تم استخدام بروتوكول SMB في المقام الأول، أليس كذلك؟وربما لن أتمكن من فتح المقابس على أي حال.

هل قد يكون مدير الأمان هو السبب (لم أستخدمه من قبل، لكنني أعلم أنه موجود)

ألن يتم طرح SecurityException بدلاً من ذلك إذا كان هذا هو الحال؟

شكرًا جزيلاً.

يحرر

تم حلها.شكرا ستيف دبليو.

اتضح أن هذا المحرك يتم إطلاقه باستخدام "LaunchAnywhere" من ZeroG.لذلك، يتم إنشاء ملف exe. والذي بدوره سيقوم بتشغيل JVM مع التطبيق المحدد.

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

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

لقد استخدمت "Process Explorer" من SysInternals لمعرفة بالضبط سطر الأوامر المستخدم لتشغيل تطبيق المحرك.

ما هذه الفوضى!

شكرا لأولئك الذين نشروا الإجابات.

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

المحلول

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

نصائح أخرى

تحقق مرة أخرى من أن الملف يسمى حقا "MyFileHere.txt" وليس "MyFileHere.txt.txt" إذا كنت تخفي امتداد الملف ، فهذا خطأ يسهل تفويته

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

لست على دراية بـ Java، لكني أعلم أنه في بعض البرامج التي كتبتها كان علي السماح لخدمة الشبكة بالوصول إلى الموارد.

في الواقع، أرى أنك قد حددت الآن الإجابة باعتبارها الإجابة الصحيحة.أوه وكان نفس إجابتي :) رائع!

كان لدي مشكلة مماثلة مرة واحدة.أعتقد أن الأمر يتعلق بالطريقة التي تحل بها جافا عناوين URI للملفات البعيدة.جرب ما يلي ومعرفة ما إذا كان يعمل:

ملف:////remote-machine/dir/MyFileHere.txt

لقد استخدمت المثال التالي للتحقق من وجود ملف في المجلدات المشتركة في الصندوق الخاص بي وعملت:

public static void main(String[] args) throws URISyntaxException{
    URI uri = new URI(args[0]); //args[0] = File:////remote-machine/dir/MyFileHere.txt
    File f = new File(uri);
    System.out.print(String.format("File %1$s Exists? %2$s", args[0],f.exists()));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top