2014-11-14 156 views
-3

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

编辑: 谢谢,山姆和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只是我现在使用的测试路径。输出给了我到目前为止我的测试中文件所在位置的绝对路径。我将使用你的提示,看看我可以如何进一步发展它。再次感谢您的指导!

+4

'我应该如何看待呢?'你可以通过编写一些代码开始,并询问在这里如果你得到的地方停留...... – 2014-11-14 21:02:45

+0

你是新来者只是寻求一些帮助非常关键。我仍然在学习如何做事,只需要一种方法的指导。我不是在寻找某个人为我写出整件事,而只是在一个方向上推动我应该如何开始...... – Jayarikahs 2014-11-14 21:32:23

+0

Jayarikahs,“我应该如何处理这个问题?”太广泛了。我们不知道你知道什么,也不知道你不知道什么。你已经研究和尝试过。所以在这种形式下,你的问题仅仅意味着*“为我写”*。顺便说一句:SO是关于编码问题的,如果你想了解更多关于某个主题的信息,可以使用google。 – 2014-11-14 21:38:48

回答

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中并稍后写入它们。我怀疑前者会对你更好,但你并没有给出很多实现细节。

+0

您可以创建一个迭代遍历每个目录和该目录的后续子目录的递归方法。在执行此操作时,对于每个带有pdf扩展名的文件,使用扩展名txt创建一个具有相同名称的索引文件。 另外,你可以使用上面的方法或类似的东西:http://stackoverflow.com/questions/929276/how-to-recursively-list-all-the-files-in-a-directory-in-c – 2014-11-14 21:36:47

+0

对不起@furkle ...当我打字的时候,我错误地敲了回车键。我没有完成。 – 2014-11-14 21:39:25

+0

@JamesShaw啊,没问题。 – furkle 2014-11-14 21:41:38

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

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

+0

我会投票,但我没有足够的声望。 – Jayarikahs 2014-11-14 22:37:47