كيف يمكنني العثور على الملف الذي قد لا يكون مؤهلا بالكامل باستخدام مسار البيئة؟

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

سؤال

ولدي اسم قابل للتنفيذ، مثل "CMD.EXE" وتحتاج لحلها هو مسار مؤهل بشكل كامل. وأنا أعلم يظهر إكس في واحدة من الدلائل المذكورة في متغير البيئة PATH. هل هناك طريقة لحل المسار الكامل من دون تحليل واختبار كل دليل في المتغير PATH؟ أساسا أنا لا أريد أن أفعل هذا:

foreach (string entry in Environment.GetEnvironmentVariable("PATH").Split(';'))
    ...

ويجب أن يكون هناك طريقة أفضل، أليس كذلك؟

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

المحلول

وهذا يبدو وكأنه وسيلة جيدة للقيام بذلك بالفعل - بقدر ما أعرف، والبحث من خلال الدلائل في متغير البيئة PATH ما يفعله ويندوز على أي حال عندما يحاول حل مسار

نصائح أخرى

إليك طريقة أخرى:

string exe = "cmd.exe";
string result = Environment.GetEnvironmentVariable("PATH")
    .Split(';')
    .Where(s => File.Exists(Path.Combine(s, exe)))
    .FirstOrDefault();

والنتيجة: C: \ WINDOWS \ SYSTEM32

ويستخدم دعوة Path.Combine () لمعالجة المسارات التي لا تنتهي بخط مائل زائدة. وهذا صحيح لسلسلة السلاسل ليتم استخدامها من قبل File.Exists () طريقة.

هل يمكن أن ينق مع

string path = Environment
                .GetEnvironmentVariable("PATH")
                .Split(';')
                .FirstOrDefault(p => File.Exists(p + filename));

وأكثر قليلا يمكن قراءتها ربما؟

ودان

حسنا، لم أجد ما يلي؛ ومع ذلك، وأعتقد أنني سوف تلتزم بتنفيذ المدارة.

    static class Win32
    {
        [DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern bool PathFindOnPath([MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszFile, IntPtr unused);

        public static bool FindInPath(String pszFile, out String fullPath)
        {
            const int MAX_PATH = 260;
            StringBuilder sb = new StringBuilder(pszFile, MAX_PATH);
            bool found = PathFindOnPath(sb, IntPtr.Zero);
            fullPath = found ? sb.ToString() : null;
            return found;
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top