我有一个共享驱动器,大约有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只是我现在使用的测试路径。输出给了我到目前为止我的测试中文件所在位置的绝对路径。我将使用您的提示来了解如何进一步开发它。再次感谢您的指导!
答案 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
循环遍历文件名,并在每次迭代时将文件名添加到输出中。