为什么我的File.Move()不工作?

时间:2010-06-16 15:01:38

标签: c# .net

我不确定我在这里做错了什么......但我注意到我的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文件路径名和更正的文件名。

有什么想法吗?

3 个答案:

答案 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阻止注释,以便你可以看到异常。

可能不是答案,但可能是一个帮助的建议。