如何循环、读取和写入文件夹和子文件夹文件
本文关键字:文件夹 文件 读取 何循环 循环 | 更新日期: 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',就好像它是一个文本文件一样。
你不能这么做。你想在那里完成什么?