重命名文件夹中的文件,忽略当前文件名

时间:2018-02-16 15:03:17

标签: c# version-control fileinfo

我正在努力使自己成为一个小版本控制服务。

我希望有一个监控文件夹的程序,当添加新文件时,它会重命名该新文件。

我已经完成了上述功能,但是我需要为该功能指定一个文件名。

我希望它重命名文件,无论它当前被调用什么。

例如,我拖动一个名为“this is the final copy.png”的文件,它会将其重命名为v1.png,下一个文件名为“finalfinaltheend.png”,它将被重命名为v2。 PNG。

这是我到目前为止所做的:

目前,当我在文件夹中拖动一个新文件时,它将搜索所有文件并查找我指定的字符串并进行更改。我想让它顺序重命名文件,无论文件名移动到文件夹时是什么。

 private void button1_Click(object sender, EventArgs e)
    {
        watch();
    }

    private void watch()
    {
        var path = @"C:\Users\jmorrish\Desktop\New folder\New folder";
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = path;
        watcher.NotifyFilter = NotifyFilters.LastWrite;
        watcher.Filter = "*.*";
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.EnableRaisingEvents = true;
    }

    private void OnChanged(object source, FileSystemEventArgs e)
    {
        DirectoryInfo d = new DirectoryInfo(@"C:\Users\jmorrish\Desktop\New folder\New folder");
        FileInfo[] infos = d.GetFiles();
        foreach (FileInfo f in infos)
        {
            File.Move(f.FullName, f.FullName.Replace("I have been renamed", "123"));
        }
    }

1 个答案:

答案 0 :(得分:1)

每次调用OnChanged方法时都会枚举每个文件,但是你应该使用(FileSystemEventArgs e)。

https://msdn.microsoft.com/en-us/library/system.io.filesystemeventargs(v=vs.110).aspx

FileSystemEventArgs提供ChangeType,FullPath和Name属性,可帮助您获取修改后的文件信息。因此,您只需重命名要修改的文件,而不是遍历整个文件夹。

private void OnChanged(object source, FileSystemEventArgs e)
{
    File.Move(e.FullPath, e.FullPath.Replace(e.Name, $"123{Path.GetExtension(e.Name)}"));
}

您也应该查看Path类,在那里您会发现许多常用操作来处理路径,文件名,扩展名等。https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx