我想在C#中創建一個void方法,它將創建一個txt文件並在計算機上寫入所有文件名的所有路徑。創建一個C#方法來保存一個txt文件中的所有文件路徑
有一個cmd命令,(dir c:\ /s /b >c:\bla.txt
),但我不想那樣。
如何在C#中執行此操作?
我想在C#中創建一個void方法,它將創建一個txt文件並在計算機上寫入所有文件名的所有路徑。創建一個C#方法來保存一個txt文件中的所有文件路徑
有一個cmd命令,(dir c:\ /s /b >c:\bla.txt
),但我不想那樣。
如何在C#中執行此操作?
方法來看待:
File.CreateText
(返回爲新創建的文件StreamWriter
)TextWriter.WriteLine
(注意,StreamWriter
從TextWriter
派生)Directory.EnumerateFiles
(避免在讀取所有文件在一次調用中 - 相反,它會讓你迭代它們使用foreach
)不要忘記using
聲明爲StreamWriter
,這樣即使有異常拋出
試試這個文件句柄將得到休息:
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));
}
}
}
}
驅動器數量上的LongLength。我想看到這臺機器的野獸! :) – 2011-03-01 07:26:03
+1獲取驅動器,我在*尼克斯,所以,我滑倒了腦海。 – Nate 2011-03-01 08:02:53
我建議寫一個遞歸方法儘管它不是一個無效的方法。 我會遍歷給定的路徑說C :.或者使用Drives System.IO類取出所有驅動器並傳遞給該方法。 然後在該方法中,我將迭代並翻出目錄和子目錄中的文件名。
我首先想到了遞歸方法。我意識到1)這是沒有必要的,因爲.Net會爲你用Directory類來處理它。 2)在遞歸方法中寫入文件將是一個痛苦。 3)當堆棧太深時,深層嵌套的層次結構可能會導致OutOfMemoryException。 4)如果不用遞歸就可以輕鬆完成,那通常是最好的(最乾淨,可讀,最明顯的)選擇。再說,我不記得我昨天寫的代碼是什麼(嗯,也許是昨天)。 :) – Nate 2011-03-01 08:08:31
代碼如下。它是在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);
}
}
有一個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%確定沒有錯誤。那爲什麼不呢?
,因爲我在Windows服務中創建它,不允許我啓動這樣的過程 – user535448 2011-03-01 13:56:30
想一想就寫出來,如果你卡住了,發佈你迄今爲止所做的,我們會幫助你。 – 2011-03-01 07:15:06
就我所知,這需要樹木知識(如果我錯了,那麼我是新手)。我真的不知道如何開始 – user535448 2011-03-01 07:17:54
@ user535448你會注意到下面有幾個實現。他們都不需要樹木。使用.Net庫使它非常簡單。當然,如果這是一種學術情況,教師可能需要一個人以某種方式寫下來。如果我必須手動執行此操作,我可能會在幾個循環中構建一個完整路徑文件的數組(或列表)。如果出於某種原因需要在內存中表示文件系統,則樹或圖形結構可能是合適的。 –
Nate
2011-03-01 16:31:59