2010-07-09 117 views
6

說我有這個文件結構如何從C#控制檯應用程序中的目錄獲取路徑?

Soultion-> Folder1中 - > FileIwant.html

所以這可能是類似於C:\ Soultion \ Folder1中\ FilterIwant.html

現在我需要閱讀這個文件放入我的應用程序我不能硬編碼它,因爲當我把它給別人時,他們可能會把它放在F:驅動器或其他東西上。

或者當我創建一個msi文件時,路徑可能會完全不同。所以,我怎麼能說也許採取

「Folder1中\ FilterIwant.html」

,並用它來獲取的文件夾路徑,無論它們放在哪裏呢?

編輯

我試圖Path.GetFullPath,但我在bin/debug目錄降落了。但我的文件不在該目錄中。我認爲這是一個幾個目錄之前。另外,如果我做一個msi文件,我會有bin/debug目錄嗎?當你運行你安裝的應用程序

回答

6

爲何未在同一文件夾中的應用程序作爲應用程序的一部分文件?這聽起來像你應該設置該文件的屬性,以便在構建時複製到輸出文件夾。

這樣做會確保您的文件在bin \ debug文件夾中爲

編輯: 要麼或你應該把你的文件的特殊文件夾中的一個,應用數據我的文檔春天在腦海中。

+0

嗯,我只是想把我的東西放在一個文件夾裏,不要在垃圾箱裏飛來飛去。 – chobo2 2010-07-10 18:34:57

+0

這很好,並且有這樣做的正當理由。特別是在鎖定的環境中。所以,我建議看看在AppData文件夾中的某處放置文件。 – 2010-07-10 19:49:53

1

Path.GetFullPath

編輯

斌/調試路徑將不存在(除非你明確告訴安裝程序使用該子目錄,當然)。

+0

試過了。路徑最終位於bin/debug中,所以我不知道該怎麼做。 – chobo2 2010-07-09 22:37:57

+0

已更新的答案以匹配已更新的問題。 – 2010-07-09 22:43:24

1

你需要System.Io.Path類的幫助:

GetFullPath:返回指定路徑字符串的絕對路徑。

編輯

您可能還需要應用程序目錄 - 這是你的應用程序將被安裝:

string appPath = Path.GetDirectoryName(Application.ExecutablePath); 
0

你可能想通過完整路徑作爲命令行論據。然後您可以使用Main方法的args參數獲取參數。相對路徑轉換爲絕對的,你可以使用Path.GetFullPath

using System; 
using System.IO; 

public class CommandLine 
{ 
    public static void Main(string[] args) 
    { 
     // The path is passed as the first argument 
     string fileName = arg[0]; 

     // get absolute path 
     fileName = Path.GetFullPath(fileName); 

     // TODO: do whatever needs to done with the passed file name 
    } 

}

4

當Visual Studio編譯您的項目時,它將輸出到bin\debug目錄中。您要引用的任何內容文件也必須複製到這些位置,以便您的應用程序駐留在該目錄中以便能夠讀取該文件。

你有兩個選擇:

  • 任你設置你的FilterIwant.htmlCopy if newerCopy to Output Directory財產;在這種情況下,如果文件已經改變,它會被複制到輸出目錄,你應該能夠引用它,並將其裝載有

  • 你剛纔定義的路徑您的app.config,類似DataPath,並將其設置爲文件所在的文件夾。從你的應用程序,然後你創建該文件的完整路徑名爲Path.Combine(AppSettings["DataPath"], "FilterIwant.html") - 用這種方法,你完全獨立於文件的真實位置,你不需要移動任何東西。另外:這讓你有機會爲你的用戶創建一個admin/config實用程序,以便他們可以選擇他們喜歡的任何目錄,並且你的應用程序會在那裏找到這些文件。
+0

使用第二種方法時,基本上每次將它部署正確時,都必須將其設置爲正確的路徑? – chobo2 2010-07-10 18:34:14

+0

@ chobo2:每次安裝都需要設置一次,是的。但是擁有一個配置條目還可以讓最終用戶自己改變它,例如使用一個配置工具。如果你將行爲硬編碼到你的代碼中,你就沒有這種可能性 – 2010-07-10 19:27:11

2

在我的控制檯應用程序中,我開始調試目錄,直到找到最想要的父文件夾。

 static void Main(string[] args) 
     { 
      Console.WriteLine("Start"); 
      var debugDir = Environment.CurrentDirectory; 
      DirectoryInfo di = new DirectoryInfo(debugDir);    
      var searchDir = ""; 
      while (!di.FullName.ToLower().EndsWith("Folder1")) 
      { 
       if(di.FullName.ToLower().EndsWith(":")) //if you went too far up as in "D:" then 
        break; 
       di = di.Parent; 
      } 

      Console.WriteLine(di.FullName); 
} 
相關問題