Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用file.move重命名新文件#_C#_Filesystemwatcher - Fatal编程技术网

C# 在C中使用file.move重命名新文件#

C# 在C中使用file.move重命名新文件#,c#,filesystemwatcher,C#,Filesystemwatcher,我对编码非常陌生,我正在编写一个将重命名文件的应用程序 通过将毫秒附加到已从MFD扫描进来的文件的现有文件名。 该文件夹是共享文件夹,重命名的文件应保留在其中,而不是复制到其他位置 通过大量的搜索,我知道这个文件。移动是我前进的方向,但是,我似乎无法让它工作 这是我的密码: private void MonitorToggle_Click(object sender, EventArgs e) { // Create a new FileSystemWatcher obje

我对编码非常陌生,我正在编写一个将重命名文件的应用程序 通过将毫秒附加到已从MFD扫描进来的文件的现有文件名。 该文件夹是共享文件夹,重命名的文件应保留在其中,而不是复制到其他位置

通过大量的搜索,我知道这个文件。移动是我前进的方向,但是,我似乎无法让它工作

这是我的密码:

private void MonitorToggle_Click(object sender, EventArgs e)
    {
       // Create a new FileSystemWatcher object.
        FileSystemWatcher fsWatcher = new FileSystemWatcher();

        switch (MonitorToggle.Text)
        {
            // Start Monitoring…
            case startMonitoring:
                if (!FilePathField.Text.Equals(String.Empty))
                {
                    //Set the watched folder path equal to the file path variable
                    fsWatcher.Path = FilePathField.Text;

                    // Set Filter.
                    fsWatcher.Filter = (FileTypeField.Text.Equals(String.Empty))? "*.*" : FileTypeField.Text;

                    // Monitor files and subdirectories.
                    fsWatcher.IncludeSubdirectories = true;

                    // Monitor all changes specified in the NotifyFilters.
                    fsWatcher.NotifyFilter = NotifyFilters.LastWrite;

                    fsWatcher.EnableRaisingEvents = true;

                    // Raise Event handlers.
                    fsWatcher.Changed += new FileSystemEventHandler(OnChanged);
                    fsWatcher.Created += new FileSystemEventHandler(OnCreated);
                }
                else
                {
                    MessageBox.Show("Please select a folder to monitor.", "Warning",MessageBoxButtons.OK, MessageBoxIcon.Warning );
                }
                break;

            // Stop Monitoring…
            case stopMonitoring:
            default:

                fsWatcher.EnableRaisingEvents = false;
                fsWatcher = null;
                break;
        }

    }

    public void OnChanged (object sender, FileSystemEventArgs e)
    {
        FileInfo file = new FileInfo(e.Name);
        string dateStamp = DateTime.Now.ToString("fff");
        string fName = file.Name;
        string newFile = string.Concat(fName, dateStamp);
        File.Move(fName,newFile);            
    }

    public void OnCreated(object sender, FileSystemEventArgs e)
    {
        FileInfo file = new FileInfo(e.Name);
        string dateStamp = DateTime.Now.ToString("fff");
        string fName = file.Name;
        string newFile = string.Concat(fName, dateStamp);
        File.Move(fName, newFile);
    }

    private void BrowseButton_Click(object sender, EventArgs e)
    {
        // Create FolderBrowserDialog object.
        FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
        // Show a button to create a new folder.
        folderBrowserDialog.ShowNewFolderButton = true;
        DialogResult dialogResult = folderBrowserDialog.ShowDialog();
        // Get selected path from FolderBrowserDialog control.
        if (dialogResult == DialogResult.OK)
        {
            FilePathField.Text = folderBrowserDialog.SelectedPath;
            Environment.SpecialFolder root = folderBrowserDialog.RootFolder;
        }
    }
每当我在我正在监视的文件夹中创建一个新文件时,它完全不起任何作用。起初我认为这可能是因为我只有“OnCreated”方法,所以我将其复制到了“OnChanged”方法中(我不确定将现有文件复制到文件夹中是否算作是“创建的”,但我运气不好)

出于兴趣,如果我没有在过滤器中指定类型,我也会抛出一个异常,但这一刻就不那么紧迫了


如果有人能指出我的错误所在,我们将不胜感激。

您的代码存在一些问题

首先,您应该使用
e.FullPath
而不是
e.Name
,否则代码将尝试重命名当前目录中的文件,而不是监视目录

其次,要接收创建的
事件,您应该包括
NotifyFilters.FileName

但是,这不会对您有多大帮助,因为在复制文件之前,文件将锁定在创建和更改的事件中,因此您将得到一个异常。此外,您可能会收到多个更改事件(在我的测试中,无论文件大小如何,我总是会收到两个,但在不同版本的Windows或.Net framework上可能会有所不同)

要解决此问题,可以使用计时器或线程来完成任务。下面是一个使用
ThreadPool
thread的示例。无论何时激发created,都会创建一个新线程。在线程中,检查文件是否已锁定(尝试打开文件),当文件解锁时,执行重命名

public class FileMon
{
    public static void Run()
    {
        FileSystemWatcher fsWatcher = new FileSystemWatcher();
        fsWatcher.Path = @"C:\Test\";        
        fsWatcher.Filter = "*.*" ;
        fsWatcher.IncludeSubdirectories = true;

        // Monitor all changes specified in the NotifyFilters.
        fsWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName ;

        fsWatcher.EnableRaisingEvents = true;

        // Raise Event handlers.
        fsWatcher.Changed += OnChanged;
        fsWatcher.Created += OnCreated;
        Console.WriteLine("[Enter] to end"); Console.ReadLine();
        fsWatcher.EnableRaisingEvents = false;
    }

    static void Worker(object state)
    {
        FileSystemEventArgs fsArgs = state as FileSystemEventArgs;
        bool done = false;
        FileInfo fi = new FileInfo(fsArgs.FullPath);

        do
        {
            try
            {
                using (File.Open(fsArgs.FullPath, FileMode.Open))
                {
                    done = true;
                }
            }
            catch
            {
                done = false;
            }
            Thread.Sleep(1000);
        } while (!done);
        Console.WriteLine("DOne");
        string dateStamp = DateTime.Now.ToString("fff");
        string fName = fi.FullName;
        string newFile = fsArgs.FullPath + dateStamp;
        File.Move(fsArgs.FullPath, newFile);
    }

    private static void OnCreated(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"Created {e.ChangeType} : {e.Name}");
        ThreadPool.QueueUserWorkItem(Worker, e);
    }

    static void OnChanged(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"{e.ChangeType} : {e.FullPath}");
    }
}

FilePathField.Text.Equals(String.Empty)
最好用
String.IsNullOrEmpty(FilePathField.Text)
fsWatcher应该在作用域中是全局的感谢您的响应。您能告诉我“Console.WriteLine([Enter]到end”);Console.ReadLine();”部分的意义是什么吗?它正在等待“Console.WriteLine(“Done”);”语句吗?它在这里阻止控制台应用程序,直到按下Enter键。您可以使用FileMon.Run()启动控制台应用程序,将文件复制到目标目录(为了好玩,请尝试并行复制多个文件),然后按Enter键结束演示。如果使用Windows服务、Windows窗体或WPF应用程序,则不需要此选项。