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

时间:2011-05-13 06:36:21

标签: c#

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

例如: - test是主文件夹

1)C:\ test \

我希望阅读和编写子文件夹文件

2)C:\测试\ 2011年12月5日\ 12-05-2011.txt

3)C:\测试\ 13-05-2011 \ 13-05-2011.txt

4)C:\测试\ 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'被拒绝。

有人能说我需要在此代码中更改内容吗?

7 个答案:

答案 0 :(得分:3)

首先,您可以通过调用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", "*.*")

答案 1 :(得分:2)

要递归遍历子文件夹,您需要一个递归函数,即。一个自称的人。这是一个应该足以让你使用的例子:

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);
    }
}

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这是一个快速的单行程序,用于将给定目录(以及所有子目录)中所有文本文件的内容写入控制台:

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

答案 4 :(得分:1)

此代码:

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);
    }
}

答案 5 :(得分:0)

首先看一下http://support.microsoft.com/kb/303974。秘密是System.IO中的Directory.GetDirectories。

答案 6 :(得分:0)

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

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

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

修改

看看以下几行:

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

最后一行是尝试阅读 FOLDER 'c:\ test',就好像它是一个文本文件一样。

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