2017-01-13 116 views
0

我在運行時在App_Data文件夾內創建新文件。我的要求是讀取這些文件名並繼續下一步。 我的代碼如下:獲取當前項目文件夾中存在的文件的名稱

var filenames = from fullFilename 
       in Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory + 
              "\\App_Data\\", "*.xml") 
       select Path.GetFileName(fullFilename); 

foreach (string filename in filenames) 
{ 
    System.Diagnostics.Debug.WriteLine("filename -- "+filename); 
} 

上面的代碼表示

找不到目錄的App_Data。

但是這存在於我的項目中。

如何獲取使用此枚舉器的所有文件的名稱?

更新:在運行時創建文件時,我使用HostingEnvironment.MapPath(@「/ myproject /」)+「/ App_Data」。這會在該位置創建文件。但它不允許我從那裏讀取。

+0

只是因爲它存在於你的源代碼樹並不意味着它存在於您的可執行文件編譯爲的應用程序二進制文件夾中。 –

+2

「AppDomain.CurrentDomain.BaseDirectory」的值是否與您認爲的完全相同? – grek40

+0

我認爲,而不是'AppDomain.CurrentDomain.BaseDirectory + 「\\ App_Data \\'''你想''Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)' –

回答

0

如果添加使用System.IO或引用它,這應該找到在App_Data文件夾中所有.xml文件,在你的應用環境:

 DirectoryInfo di = new DirectoryInfo(Server.MapPath("/App_Data")); 
     var fi = di.EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly); 

// fi should contain the enumeration of files found at that path 
// you can iterate over fi and have all the file info of each file found 

[更新]

如果您已經解析了路徑字符串,則可以將整個Server.MapPath(「/ App_Data」)替換爲桌面應用程序的路徑,其餘部分保持不變。

要遍歷集合只需使用一個foreach循環,如:

  foreach (FileInfo file in fi) 
      { 
       string s = "File Name: " + file.Name + "\r"; 
       s += "Full Path: " + file.FullName + "\r"; 
       s += "File Ext.: " + file.Extension + "\r"; 
       MessageBox.Show(s); 
      } 

[更新2]

由於OP指的是一個網絡方案

通過增加使用制度.Web.Hosting聲明到我的控制器我能夠在mvc示例應用程序中測試'HostingEnvironment.MapPath'。 這是我想出來的。

本例找到虛擬路徑'/ App_Data',收集它在路徑中找到的'.xml'文件。然後它迭代集合並將每個文件的內容讀入數組元素。 最後,它將文件名顯示爲視圖中的鏈接,以及每個文件的內容帶有標題#。請記住,這可能不是最優化的代碼示例。

C#代碼:MVC中的控制器

 DirectoryInfo di = new DirectoryInfo(HostingEnvironment.MapPath("/App_Data")); 
     var fi = di.EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly); 
     ViewBag.Files = fi; 
     string[] fs = new string[fi.Count()]; 
     int fc = fi.Count(); 
     int x = 0; 
     foreach (FileInfo f in fi) 
     { 
      StreamReader sr = new StreamReader(f.FullName); 
      fs[x] = sr.ReadToEnd(); 
      sr.Close(); 
      if (x < fc) x++; 
     } 
     ViewBag.Contents = fs; 
     ViewBag.ContCount = fc; 

HTML:在查看

<div> 
    <h3>Files Found:</h3> 
    <p> 
     @foreach (FileInfo f in @ViewBag.Files) 
     { 
      <a href="@f.FullName">@f.Name</a><br /> 
     } 

    </p> 

</div> 
<div> 
    <h3>File Contents:</h3> 
    @for (int c = 0; c < @ViewBag.ContCount; c++) 
    { 
     <h4>Heading @(c)</h4> 
     <p> 
      @ViewBag.Contents[@c] 
     </p> 
     <hr /> 
    } 
</div> 
0

其實AppDomain.CurrentDomain.BaseDirectory給你當前的工作目錄,在調試它給你的路徑Your Projectfolder\\bin\\Debug\\。你想找到項目文件夾內的App_Data文件夾,而不是在debug所以,你必須回來到項目文件夾,然後找到App_Data類似如下:

string projectFolder = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.FullName; 
string folderAppData = Path.Combine(projectFolder, "App_Data"); 
if (Directory.Exists(folderAppData)) 
{ 
    foreach (string file in Directory.EnumerateFiles(folderAppData,"*.xml")) 
    { 
      // Do your stuff here 
    } 
} 
+0

謝謝。但問題在於迭代該文件夾內的文件。我能夠找到HostingEnvironment.MapPath(@「/ myproject /」)+「/ App_Data」的路徑,因爲我已經在該文件夾中創建了文件作爲第一步。在讀取文件時,它會拋出異常「無法找到部分路徑C:\ Users \ User1 \ Workspace \ Myproject \ App_Data」 – Neha

+0

如果是Web應用程序,則使用「Server.MapPath」 –

相關問題