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

Rename files in folder, ignoring current file name

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

我想要一个监视文件夹的程序,当添加新文件时,它会重命名该新文件。

我已经使上述功能正常工作,但是我需要为该功能指定一个文件名才能正常工作。

我希望它重命名文件,而不管它当前叫什么。

例如,我拖入一个名为:"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"));
        }
    }

每次调用 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 class,在那里您会发现许多用于处理路径、文件名、扩展名等的常用操作。https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx