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

本文关键字:文件 有效 方法 创建 路径 文本 | 更新日期: 2023-09-27 18:30:23

我有一个共享驱动器,其中包含大约 ~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相同的文件名,并保存在与文件相同的目录中。 我应该如何处理这个问题? 感谢您的建议!

编辑:谢谢,山姆和弗克尔。 当我开始编写它时,我终于能够获得类似于您所做的文件路径。

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 只是我现在正在使用的测试路径。 到目前为止,输出为我提供了文件在测试中位置的绝对路径。 我将使用您的提示来了解如何进一步发展它。 再次感谢您的指导!

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

至于创建.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中并在以后写入它们。我怀疑前者更适合您,但您并没有真正给出很多实现细节。

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

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