ما يمكن أن يتسبب في الدليل الحالي من التطبيق تنفيذ لتغيير؟

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

سؤال

ولدي # تطبيق C التي تتضمن التعليمات البرمجية التالية:

string file = "relativePath.txt";

//Time elapses...

string contents = File.ReadAllText(file);

وهذا يعمل بشكل جيد، أكثر من مرة. تتم قراءة الملف النسبي إلى الدليل الذي بدأ التطبيق من. ومع ذلك، في الاختبار، وقد وجد أنه إذا تركت وحدها لمدة 5 ساعات، والتطبيق سوف رمي FileNotFoundException قائلا ان "C: \ الوثائق وإعدادات \ بمسؤول \ relativePath.txt" لا يمكن العثور عليها. إذا تم تشغيل الإجراء الذي يقرأ الملف على الفور رغم ذلك، تتم قراءة الملف من الموقع المناسب، ونحن سوف ندعو "C: \ فو \ relativePath.txt"

وماذا يعطي؟ و، ما هو أفضل حل؟ حسم ملف ضد Assembly.GetEntryAssembly().Location؟

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

المحلول

إذا كان الملف هو دائما في مسار قريب للجمعية قابل للتنفيذ، ثم نعم، استخدم Assembly.Location. أنا في الغالب استخدام Assembly.GetExecutingAssembly إذا كان ذلك ممكنا على الرغم بدلا من Assembly.GetEntryAssembly. وهذا يعني أنه إذا كنت الوصول إلى الملف من DLL، والطريق ستكون نسبة إلى المسار DLL.

نصائح أخرى

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

ولديها خاصية تسمى <لأ href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.restoredirectory(VS.85).aspx" يختلط = "noreferrer "> RestoreDirectory الذي يتسبب في الحوار لإعادة المسار. ولكن أعتقد أن الافتراضي هو "كاذبة".

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

<ع> استخدام المسارات النسبية وجعل التعليمات البرمجية من الصعب الحفاظ على أنه تغيير في جزء لا تمت بصلة المشروع الخاص بك يمكن أن يسبب جزء آخر إلى فشل.

وإذا كنت تفعل somehting مثل

> مؤتمر نزع السلاح المجلد C: \ 1

ج: \ مجلد 1> ../folder 2 / theApplication.exe

ودليل العمل الحالي للapplicaiton سيكون ج: \ مجلد 1

وهنا هو برنامج سبيل المثال

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CWD {
    class Program {
        static void Main (string[] args) {
            Console.WriteLine(Application.StartupPath);
        }
    }
}

وبناء هذا في visualstudio ثم فتح موجه الأوامر في التصحيح الدليل / بن والقيام

وبن / التصحيح> CWD.exe

وبعد ذلك القيام

وبن / التصحيح> سي دي ../../ > بن / تصحيح / CWD.exe

وسترى الفرق في مسار بدء التشغيل.

في ما يتعلق السؤال الأصلي ... "إذا تركت وحدها لمدة 5 ساعات، فإن التطبيق رمي FileNotFoundException"

وعندما يتم تشغيل التطبيق، والانتقال فقط، أو تحريك هذا الملف من الموقع المتوقع أن يسبب هذا الخطأ.

وجريج

إذا كنت تستخدم openfiledialog والخاصية مسار (لست متأكدا عن الاسم الدقيق) تذكر صحيح ثم فإنه سيتم تغيير الدليل الحالي على ما أعتقد.

scroll top