我在编写文件夹和子文件夹中的文件时遇到问题。
例如: - 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'被拒绝。
有人能说我需要在此代码中更改内容吗?
答案 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',就好像它是一个文本文件一样。
你做不到。你想在那里完成什么?