2011-03-01 41 views
0

我想在C#中創建一個void方法,它將創建一個txt文件並在計算機上寫入所有文件名的所有路徑。創建一個C#方法來保存一個txt文件中的所有文件路徑

有一個cmd命令,(dir c:\ /s /b >c:\bla.txt),但我不想那樣。

如何在C#中執行此操作?

+2

想一想就寫出來,如果你卡住了,發佈你迄今爲止所做的,我們會幫助你。 – 2011-03-01 07:15:06

+0

就我所知,這需要樹木知識(如果我錯了,那麼我是新手)。我真的不知道如何開始 – user535448 2011-03-01 07:17:54

+0

@ user535448你會注意到下面有幾個實現。他們都不需要樹木。使用.Net庫使它非常簡單。當然,如果這是一種學術情況,教師可能需要一個人以某種方式寫下來。如果我必須手動執行此操作,我可能會在幾個循環中構建一個完整路徑文件的數組(或列表)。如果出於某種原因需要在內存中表示文件系統,則樹或圖形結構可能是合適的。 – Nate 2011-03-01 16:31:59

回答

6

方法來看待:

不要忘記using聲明爲StreamWriter,這樣即使有異常拋出

+0

我不知道Directory.EnumerateFiles。我喜歡! – Nate 2011-03-01 07:32:14

+0

@Nate:我應該提到它在.NET 4中是新的。 – 2011-03-01 07:34:20

+0

是的,剛剛意識到這一點。現在將我的項目類型更改爲Monodevelop中的4.0配置文件,以查看它是否可以在那裏工作。 – Nate 2011-03-01 07:37:36

1

試試這個文件句柄將得到休息:

void GetFiles() 
{ 
    StreamWriter wr = File.CreateText(Server.MapPath("") + "txt1.text"); 

    DriveInfo[] drive = DriveInfo.GetDrives(); 
    for (long count = 0; count < drive.LongLength; count++) 
    { 
     string[] dir = Directory.GetDirectories(drive.GetValue(count).ToString(), "*", SearchOption.AllDirectories); 
     for (long dr = 0; dr < dir.LongLength; dr++) 
     { 
      string[] file = Directory.GetFiles(dir.GetValue(dr).ToString(), "*", SearchOption.AllDirectories); 
      for (long fl = 0; fl < file.LongLength; fl++) 
      { 
       wr.WriteLine(file.GetValue(fl)); 
      } 
     } 
    } 
} 
+1

驅動器數量上的LongLength。我想看到這臺機器的野獸! :) – 2011-03-01 07:26:03

+0

+1獲取驅動器,我在*尼克斯,所以,我滑倒了腦海。 – Nate 2011-03-01 08:02:53

0

我建議寫一個遞歸方法儘管它不是一個無效的方法。 我會遍歷給定的路徑說C :.或者使用Drives System.IO類取出所有驅動器並傳遞給該方法。 然後在該方法中,我將迭代並翻出目錄和子目錄中的文件名。

+0

我首先想到了遞歸方法。我意識到1)這是沒有必要的,因爲.Net會爲你用Directory類來處理它。 2)在遞歸方法中寫入文件將是一個痛苦。 3)當堆棧太深時,深層嵌套的層次結構可能會導致OutOfMemoryException。 4)如果不用遞歸就可以輕鬆完成,那通常是最好的(最乾淨,可讀,最明顯的)選擇。再說,我不記得我昨天寫的代碼是什麼(嗯,也許是昨天)。 :) – Nate 2011-03-01 08:08:31

1

代碼如下。它是在Mac OS X上的Mono上編寫的,因此您需要更改目錄。另外,如果你沒有和在管理員下運行,它可能會在某些目錄中引發各種錯誤。

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     WritePaths("files.txt", "/", true); 
    } 

    public static void WritePaths(string fileName, string directory, bool recursive) 
    { 
     try 
     { 
      string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories); 
      using(StreamWriter sw = new StreamWriter(fileName)) 
      { 
       foreach(string file in files) 
       { 
        sw.WriteLine(file); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Exception: " + ex.Message); 
     }   
    } 
} 

根據其他答案,我修改了我的方法以使用更新的Directory.EnumerateFiles。我更喜歡這個版本。

public static void WritePaths(string fileName, string directory) 
    { 
     try 
     { 
      using(StreamWriter sw = new StreamWriter(fileName)) 
      { 
       foreach (string f in Directory.EnumerateFiles(directory, "*", SearchOption.AllDirectories)) 
       { 
        sw.WriteLine(f); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Exception: " + ex.Message); 
     }   
    } 
0

有一個cmd命令,(dir c:\ /s /b >c:\bla.txt),但我不希望出現這種情況。

你不想手動的命令,並在Windows控制檯執行它,或者你不想使用DIR命令(您想C#實現自己)?

如果您只是想爲您處理手動輸入的C#程序,則可以使用C#啓動進程並運行內置的DIR命令。見Process.Start

Process.Start("cmd", @"/c dir c:\ /s /b >c:\bla.txt"); 

簡單,可讀,我100%確定沒有錯誤。那爲什麼不呢?

+0

,因爲我在Windows服務中創建它,不允許我啓動這樣的過程 – user535448 2011-03-01 13:56:30

相關問題