从文件路径创建文本文件的有效方法

时间:2014-11-14 21:00:56

标签: c#

我有一个共享驱动器,大约有10,000个文件位于约7,000个不同的文件夹中,这些文件夹可能超过父文件夹的7个文件夹。大多数这些文件(如果不是全部)都是.pdf文件,我想创建一个具有相同名称的每个.pdf文件的索引文件。索引文件将包含由管道分隔的文件夹名称。

结构示例:

C:\Files\1000\2000\01\99\AB\01\00\file1.pdf
C:\Files\1000\2000\01\99\CD\02\10\file2.pdf
C:\Files\1200\2010\20\99\WE\30\12\file3.pdf
C:\Files\1300\2000\31\99\BA\56\23\file4.pdf
C:\Files\1400\2014\59\99\RT\34\34\file5.pdf

索引文件内容示例:

1000|2000|01|99|AB|01|00|<some static info>|<some static info>
1000|2000|01|99|CD|02|10|<some static info>|<some static info>
1200|2010|20|99|WE|30|12|<some static info>|<some static info>
1300|2000|31|99|BA|56|23|<some static info>|<some static info>
1400|2014|59|99|RT|34|34|<some static info>|<some static info>

最终输出:

C:\Files\1000\2000\01\99\AB\01\00\file1.pdf
C:\Files\1000\2000\01\99\AB\01\00\file1.txt
C:\Files\1000\2000\01\99\CD\02\10\file2.pdf
C:\Files\1000\2000\01\99\CD\02\10\file2.txt
C:\Files\1200\2010\20\99\WE\30\12\file3.pdf
C:\Files\1200\2010\20\99\WE\30\12\file3.txt
C:\Files\1300\2000\31\99\BA\56\23\file4.pdf
C:\Files\1300\2000\31\99\BA\56\23\file4.txt
C:\Files\1400\2014\59\99\RT\34\34\file5.pdf
C:\Files\1400\2014\59\99\RT\34\34\file5.txt

索引文件将保存为.pdf的相同文件名,并保存在与文件相同的目录中。我该怎么做呢?谢谢你的建议!

编辑: 谢谢Sam和Furkle。当我开始编写它时,我终于能够获得类似于你所做文件的路径。

string[] filenames = Directory.GetFiles(loca, "*.*", SearchOption.AllDirectories);
string fname = DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; //wrote it to a file just to see if I could get the path

File.CreateText(Path.Combine(Log, fname)).Dispose();

foreach(string filename in filenames)
{
using (FileStream f = new FileStream(Path.Combine(Log, fname), FileMode.Append, FileAccess.Write, FileShare.Write))
Using (StreamWriter l = new StreamWriter(f))
{
l.WriteLine(filename);
}
}
MessageBox.Show("Done");

变量loca只是我现在使用的测试路径。输出给了我到目前为止我的测试中文件所在位置的绝对路径。我将使用您的提示来了解如何进一步开发它。再次感谢您的指导!

2 个答案:

答案 0 :(得分:0)

就创建.txt文件而言,您可以做以下事情:

// define your DirectoryInfo dir here

// iterates through all files at all levels in your directory
foreach (FileInfo file in dir.EnumerateFiles("*.pdf", SearchOption.AllDirectories))
{
    // gets the file name without the extension
    string filenameWithoutExtension = file.Name.Substring(
                                       0, file.Name.Length - file.Extension.Length);

    // creates a FileInfo object for the text file you aim to create
    FileInfo textFile = new FileInfo(
                         file.Directory.ToString() + @"\" + file.Name + ".txt");

    // checks that the file does not already exist
    if (!textFile.Exists)
    {
        // creates an empty file
        textFile.Create();
    }
}

这将创建一个与您的文件同名的文本文件(例如,file1.pdf它将在同一目录中创建一个名为file1.txt的文件)。请注意,IO操作非常难以预测,因此您需要添加适合您需求/环境的异常处理。另请注意,这仅适用于扩展名为.pdf的情况 - 如果您需要担心PDF,则需要使用.EnumerateFiles().Where(a => a.Extension.ToLower() == ".pdf")

就实际写入这些文件而言,您可以在循环中,在textFile.Create()之后立即执行此操作,或者您可以将每个FileInfo存储在IEnumerable中并稍后写入它们。我怀疑前者会对你更好,但你还没有给出很多实现细节。

答案 1 :(得分:0)

  • 获取文件名。 Directory.GetFileSystemEntries方法可能会有所帮助

  • 使用foreach循环遍历文件名,并在每次迭代时将文件名添加到输出中。