C#文件移动通常很慢

时间:2017-11-02 12:10:16

标签: c# file move

我有一个Windows Forms应用程序,我运行时没有将表单显示为命令行应用程序。我附加一个控制台以写入stdout。在此模式下,两个本地文件系统位置之间的100 KB文件的文件移动(File.Move)通常需要90秒,但有时非常快。文件移动会更改同一目录中的文件名和扩展名。初始文件扩展名为.jpg,目标文件扩展名为.tmp。如果我将Visual Studio IDE附加到正在运行的命令行可执行文件并在文件移动之前设置断点,则它会非常快速地执行。

如果从Visual Studio IDE运行程序(使用参数来停止显示任何表单)并在文件移动之前设置断点,它将非常快速地执行。如果我在文件移动后设置断点,程序通常需要90秒才能到达断点。似乎在文件移动之前停止程序允许它快速执行。

使用OpenedFilesView在90秒等待期间检查打开的文件我可以看到正在重命名的文件被System Process打开。我检查移动前锁定的源文件(NewFile)。它是在程序的早期使用以下代码编写的:

            Image Img = new Bitmap(sFile);
            PropertyItem[] propItems = Img.PropertyItems;

            string NewFile = sFile + "_1.jpg";
            // For each PropertyItem in the array, display the id, 
            // type, and length.
            Encoding _Encoding = Encoding.UTF8
            PropertyItem propItem2 = Img.PropertyItems[0];

            Image file;
            using (FileStream stream = new FileStream(sFile, FileMode.Open, FileAccess.Read))
            {

                file = Image.FromStream(stream);
                if (sTagName == "XPTitle") propItem2.Id = 0x9c9b;  // this is called 'XPTitle'
                if (sTagName == "XPComment") propItem2.Id = 0x9c9c;  // this is called 'XPComment'
                propItem2.Type = 2;
                propItem2.Value = System.Text.Encoding.UTF8.GetBytes(sTagValue + "\0");
                propItem2.Len = propItem2.Value.Length;
                file.SetPropertyItem(propItem2);


                file.Save(NewFile);
                file.Dispose();
                file = null;
                stream.Dispose();
            }

            Img.Dispose();
            Img = null;

            System.IO.File.Delete(sFile);
            System.IO.File.Move(NewFile, sFile); // sometimes hangs here

移动前文件未锁定。通过尝试使用读/写访问权限从源文件路径打开文件流来检查锁定。

构建并运行应用程序作为控制台应用程序不会改变行为。

在文件移动之前放入Thread.Sleep(1000)使其运行得非常快但我想知道为什么这是有效的。

我在使用MalwareBytes Antivirus软件的Windows 10环境中运行

0 个答案:

没有答案