2011-11-04 185 views
0

我要的是什麼樣的「的」命令:提供一個文件名(EXE,蝙蝠......),並返回該文件的完整路徑:路徑解析器在.NET

它的java.exe
C:\ WINDOWS \ SYSTEM32 \ java.exe的

的代碼將是這樣的:

string fileName = "java.exe" 
string fullPath = PathResolver.Resolve(fileName); 

我們有在.NET框架這樣的設施?

謝謝。

更新:
最後,我寫了一個自己:

// Reoslve the full path of a file name 
    // fileName: of absolute path or relative path; with ext or without ext 
    static string ResolvePath(string fileName) 
    { 
     // 0. absolute path 
     string[] stdExts = { ".bat", ".cmd", ".pl", ".exe" }; 
     if (Path.IsPathRooted(fileName)) 
     { 
      if (File.Exists(fileName)) 
      { 
       return fileName; 
      } 
      else 
      { 
       foreach (string eachExt in stdExts) 
       { 
        string fullPath = fileName + eachExt; 
        if (File.Exists(fullPath)) 
        { 
         return fullPath; 
        } 
       } 
      } 

      return ""; 
     } 

     // 1. candidate extensions 
     string fileNameNoExt = Path.GetFileNameWithoutExtension(fileName); 
     string ext = Path.GetExtension(fileName); 
     string[] candidateExts; 
     if (string.IsNullOrEmpty(ext)) 
     { 
      candidateExts = stdExts; 
     } 
     else 
     { 
      string[] exts = { ext }; 
      candidateExts = exts; 
     } 

     // 2. candidate path: 
     //  http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#search_order_for_desktop_applications 
     List<string> candidatePaths = new List<string>(); 

     // application dir 
     string fileApp = Process.GetCurrentProcess().MainModule.FileName; 
     candidatePaths.Add(Path.GetDirectoryName(fileApp)); 

     // current dir 
     candidatePaths.Add(Directory.GetCurrentDirectory()); 

     // system dir 
     candidatePaths.Add(Environment.SystemDirectory); 

     // windows dir 
     string winDir = Environment.GetEnvironmentVariable("windir"); 
     candidatePaths.Add(winDir); 

     // PATH 
     string[] paths = Environment.GetEnvironmentVariable("PATH").Split(';'); 
     foreach (string path in paths) 
     { 
      // strip the trailing '\' 
      candidatePaths.Add(Path.GetDirectoryName(path)); 
     } 

     // 3. resolve 
     foreach (string eachPath in candidatePaths) 
     { 
      foreach (string eachExt in candidateExts) 
      { 
       string fullPath = eachPath + "\\" + fileNameNoExt + eachExt; 
       if (File.Exists(fullPath)) 
        return fullPath; 
      } 
     } 

     return ""; 
    } 

回答

2

我不知道這是否可以幫助你:

public string PathResolver(string filename) 
    { 
     string[] paths = Environment.GetEnvironmentVariable("PATH").Split(';'); 
     foreach (string path in paths) 
     { 
      string fname = Path.Combine(path, filename); 
      if (File.Exists(filename)) return fname; 
     } 
     return ""; 
    } 
+0

是啊,謝謝。我們絕對可以自己寫一個,我們可以按照DLL搜索順序:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx,但我很希望有一個在.NET框架第一:) –

+0

最後,我寫了一個自己的建議... –

0

看看FileInfoFullName property類。

FileInfo fi = new FileInfo("foo.exe"); 
string fullanme = fi.FullName; 
+1

這不會做任何路徑解析,而是返回:CurrentDir + foo.exe –

0

我可以提出一個辦法,找出可執行文件的完整路徑後,你實際上僅使用文件名(可能不是你想要什麼)運行它:

Process p = new Process(); 
p.StartInfo = new ProcessStartInfo("notepad.exe"); 
p.Start(); 
Console.WriteLine(p.MainModule.FileName); 
+1

謝謝,是的,這不是我想要的 - 我想先得到路徑,然後啓動應用程序:因爲如果它是一個bat/cmd文件,我需要運行它像:cmd/c fileName –

1

你應該採取一起來看看這款免費的圖書館,在NDepend的和用於其他項目,

http://filedirectorypath.codeplex.com/

+0

謝謝你,這是一個強大的庫,但似乎不包括我想要的路徑解析器。 –