我不确定我在这里做错了什么......但我注意到我的File.Move()没有重命名任何文件。
另外,有人知道在我的第二个循环中,我能够使用路径和清理文件名列表填充我的.txt文件吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//recurse through files. Let user press 'ok' to move onto next step
string[] files = Directory.GetFiles(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.Write(file + "\r\n");
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
//End section
//Regex -- find invalid chars
string pattern = " *[\\~#%&*{}/<>?|\"-]+ *";
string replacement = " ";
Regex regEx = new Regex(pattern);
string[] fileDrive = Directory.GetFiles(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories);
List<string> filePath = new List<string>();
//clean out file -- remove the path name so file name only shows
string result;
foreach(string fileNames in fileDrive)
{
result = Path.GetFileName(fileNames);
filePath.Add(result);
}
StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt");
//Sanitize and remove invalid chars
foreach(string Files2 in filePath)
{
try
{
string sanitized = regEx.Replace(Files2, replacement);
sw.Write(sanitized + "\r\n");
System.IO.File.Move(Files2, sanitized);
System.IO.File.Delete(Files2);
}
catch (Exception ex)
{
Console.Write(ex);
}
}
sw.Close();
}
}
}
我对C#非常陌生并试图编写一个通过特定驱动器进行递归的应用程序,找到无效字符(如RegEx模式中所指定的),将其从文件名中删除,然后编写一个包含该文件的.txt文件路径名和更正的文件名。
有什么想法吗?
答案 0 :(得分:6)
您的文件路径列表仅包含文件 names 。您已在调用Path.GetFileName()
时从中删除了目录信息,因此您的File.Move正在应用程序的默认目录中查找目标文件,而不是其原始位置。
我认为保存已清理文件名的代码是正确的。您应该使用StreamWriter周围的using()
构造,如下所示,以确保文件在完成后关闭。
//clean out file -- remove the path name so file name only shows
string result;
foreach(string fileNames in fileDrive)
{
// result = Path.GetFileName(fileNames); // don't do this.
filePath.Add(fileNames);
}
using (StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt"))
{
//Sanitize and remove invalid chars
foreach(string Files2 in filePath)
{
try
{
string filenameOnly = Path.GetFileName(Files2);
string pathOnly = Path.GetDirectoryName(Files2);
string sanitizedFilename = regEx.Replace(filenameOnly, replacement);
string sanitized = Path.Combine(pathOnly, sanitizedFilename);
sw.Write(sanitized + "\r\n");
System.IO.File.Move(Files2, sanitized);
}
catch
{
}
}
}
答案 1 :(得分:2)
对File.Move()的调用是否抛出任何异常?你下方有一个空的挡块,阻止你看到它们。尝试删除catch {}或在其中放入一些代码来记录任何异常。
答案 2 :(得分:1)
尝试使用File.AppendAllLines()
(带有集合)或File.AppendAllText()
(对于每个人而言)而不是流。这将使事情变得更容易。
另外,我理解不希望你的应用程序炸弹,但至少,当你正在编写/调试时,你的try
阻止注释,以便你可以看到异常。
可能不是答案,但可能是一个帮助的建议。