在C#中替换部分文件名

时间:2012-05-07 19:12:22

标签: string visual-studio-2010 c#-4.0

我有一个包含.pdf个文件的文件夹。在大多数文件的名称中,我想用另一个字符串替换特定的字符串。

这是我写的。

  private void btnGetFiles_Click(object sender, EventArgs e)
    {
        string dir = tbGetFIles.Text;
        List<string> FileNames = new List<string>();

        DirectoryInfo DirInfo = new DirectoryInfo(dir);

        foreach (FileInfo File in DirInfo.GetFiles())
        {
            FileNames.Add(File.Name);       
        }

        lbFileNames.DataSource = FileNames;
    }

这里我提取列表框中的所有文件名。

    private void btnReplace_Click(object sender, EventArgs e)
    {
        string strReplace = tbReplace.Text; // The existing string
        string strWith = tbWith.Text; // The new string

        string dir = tbGetFIles.Text;
        DirectoryInfo DirInfo = new DirectoryInfo(dir);
        FileInfo[] names = DirInfo.GetFiles();


        foreach (FileInfo f in names)
        {
            if(f.Name.Contains(strReplace))
            {
                f.Name.Replace(strReplace, strWith);
            }

        }

在这里我想做替换,但出了点问题。什么?

5 个答案:

答案 0 :(得分:5)

听起来您想要更改磁盘上文件的名称。如果是这样,那么您需要使用File.Move API而不是更改实际字符串,即文件名。

您正在犯的另一个错误是Replace来电。 .Net中的string是不可变的,因此所有变异的API(如Replace)都会返回新的string而不是更改旧的string newName = f.Name.Replace(strReplace, strWith); File.Move(f.Name, newName); 。要查看更改,您需要将新值分配回变量

{{1}}

答案 1 :(得分:2)

f.Name是一个只读属性。 f.Name.Replace(..)只返回一个包含所需文件名的新字符串,但实际上从未更改过该文件 我建议以下内容,但我没有测试过:

File.Move(f.Name, f.Name.Replace(strReplace, strWith));

答案 2 :(得分:1)

替换返回另一个字符串,它不会更改原始字符串 所以你需要写

string newName = f.Name.Replace(strReplace, strWith); 

当然这不会改变磁盘上文件的名称 如果这是你的意图那么你应该看看

File.Move(f.Name, newName);

还要记住,如果目标文件存在,File.Move将失败并出现异常。

See here for an example

答案 3 :(得分:0)

乍一看,似乎你没有将被替换的字符串重新分配给你的f.Name变量。试试这个:

string NewFileName = f.Name.Replace(strReplace, strWith);
File.Copy(f.Name, NewFileName);
File.Delete(f.Name);

答案 4 :(得分:0)

当您致电string.Replace时,这不会改变您现有的字符串。相反,它返回一个新字符串。

您需要将代码更改为以下内容:

if(f.Name.Contains(strReplace)) 
{ 
    string newFileName = f.Name.Replace(strReplace, strWith); 
    //and work here with your new string
}