如何循环、读取和写入文件夹和子文件夹文件

本文关键字:文件夹 文件 读取 何循环 循环 | 更新日期: 2023-09-27 17:56:13

我在文件夹和子文件夹中写入文件时遇到问题。

例如:- test 是主文件夹

1) C:''测试''

我想读写子文件夹文件

2)C:''test''12-05-2011''12-05-2011.txt

3)C:''test''13-05-2011''13-05-2011.txt

4)C:''test''14-05-2011''14-05-2011.txt

我的代码是:

private void button1_Click(object sender, EventArgs e)
{
    const string Path1 = @"C:'test";
    DoOnSubfolders(Path1);
    try
    {
        StreamReader reader1 = File.OpenText(Path1);
        string str = reader1.ReadToEnd();
        reader1.Close();
        reader1.Dispose();
        File.Delete(Path1);
        string[] Strarray = str.Split(new char[] { Strings.ChrW(10) });
        int abc = Strarray.Length - 2;
        int xyz = 0;
        while (xyz <= abc)
}

我收到错误。 错误是对路径"C:''test"的访问被拒绝。

谁能告诉我我需要在此代码中更改什么?

如何循环、读取和写入文件夹和子文件夹文件

起初,您可以通过调用DirectoryInfo.GetFiles(string, SearchOption)并将SearchOption设置为 AllDirectories 来展平递归调用。

还有一个常见的错误(但从您的问题中不清楚)是需要先创建一个目录,然后才能创建文件。只需致电Directory.CreateDirectory() .并将完整的路径(没有文件名)放入其中。如果目录已经存在,它将自动不执行任何操作,并且还能够创建所需的整个结构。因此,不需要检查或递归调用(如果您没有写入权限,则可能是 try-catch)。

更新

所以这里有一个示例,它读取一个文件,在每一行上进行一些转换,然后将结果写入一个新文件。如果这正常工作,原始文件将被转换后的文件替换。

private static void ConvertFiles(string pathToSearchRecursive, string searchPattern)
{
    var dir = new DirectoryInfo(pathToSearchRecursive);
    if (!dir.Exists)
    {
        throw new ArgumentException("Directory doesn't exists: " + dir.ToString());
    }
    if (String.IsNullOrEmpty(searchPattern))
    {
        throw new ArgumentNullException("searchPattern");
    }
    foreach (var file in dir.GetFiles(searchPattern, SearchOption.AllDirectories))
    {
        var tempFile = Path.GetTempFileName();
        // Use the using statement to make sure file is closed at the end or on error.
        using (var reader = file.OpenText())
        using (var writer = new StreamWriter(tempFile))
        {
            string line;
            while (null != (line = reader.ReadLine()))
            {
                var split = line.Split((char)10);
                foreach (var item in split)
                {
                    writer.WriteLine(item);
                }
            }
        }
        // Replace the original file be the converted one (if needed)
        ////File.Copy(tempFile, file.FullName, true);
    }
}

在您的情况下,您可以调用此函数

ConvertFiles(@"D:'test", "*.*")

要递归遍历子文件夹,您需要一个递归函数,即。一个自称。下面是一个足以让您使用的示例:

static void Main(string[] args)
{
    const string path = @"C:'temp'";
    DoOnSubfolders(path);
}
private static void DoOnSubfolders(string rootPath)
{
    DirectoryInfo d = new DirectoryInfo(rootPath);
    FileInfo[] fis = d.GetFiles();
    foreach (var fi in fis)
    {
        string str = File.ReadAllText(fi.FullName);
        //do your stuff
    }
    DirectoryInfo[] ds = d.GetDirectories();
    foreach (var info in ds)
    {
        DoOnSubfolders(info.FullName);
    }
}

您需要使用类目录信息和文件信息。

DirectoryInfo d = new DirectoryInfo("c:''test");
FileInfo [] fis = d.GetFiles();
DirectoryInfo [] ds = d.GetDirectories();

下面是一个快速的行,用于将给定目录(和所有子目录)中所有文本文件的内容写入控制台:

Directory.GetFiles(myDirectory,"*.txt*",SearchOption.AllDirectories)
       .ToList()
       .ForEach(a => Console.WriteLine(File.ReadAllText(a)));

此代码:

const string Path1 = @"C:'test";  
StreamReader reader1 = File.OpenText(Path1);

说打开"c:''test"作为文本文件... 您收到的错误是:

Access to the path 'C:'test' is denied

您收到错误是因为如上所述,"c:''test"是一个文件夹。 您无法像打开文本文件一样打开文件夹,因此出现错误...

扩展

名为.txt的文件的基本(全深度搜索)如下所示:

static void Main(string[] args) {
    ProcessDir(@"c:'test");
}

static void ProcessDir(string currentPath) {
    foreach (var file in Directory.GetFiles(currentPath, "*.txt")) {
        // Process each file (replace this with your code / function call /
        // change signature to allow a delegate to be passed in... etc
        // StreamReader reader1 = File.OpenText(file);  // etc
        Console.WriteLine("File: {0}", file);
    }
    // recurse (may not be necessary), call each subfolder to see 
    // if there's more hiding below
    foreach (var subFolder in Directory.GetDirectories(currentPath)) {
        ProcessDir(subFolder);
    }
}
首先看看

http://support.microsoft.com/kb/303974。 秘密是 System.IO 中的Directory.GetDirectory。

您必须在 c:''Test 文件夹上配置 (NTFS) 安全性。

通常,您将在非管理员帐户下运行应用程序,因此运行该程序的帐户应该具有访问权限。

如果您在带有 UAC 的 Vista 或 Windows 7 上运行,则可能是管理员,但默认情况下不会使用管理(提升)权限。

编辑

请看这些行:

const string Path1 = @"C:'test";
DoOnSubfolders(Path1);
try
{
    StreamReader reader1 = File.OpenText(Path1);

最后一行试图读取文件夹'c:''test',就好像它是一个文本文件一样。

你不能这么做。你想在那里完成什么?