C#字节文件拷贝挂起filestream.close

C#字节文件拷贝挂起filestream.close,c#,file,filestream,C#,File,Filestream,我正试图在一个c#winforms应用程序中实现一个带有进度条的文件副本。 现在只有一条线。 我发现filestream.close()上的文件传递达到了100%,并且挂起了很长时间。 目标是UNC路径 我的实现有什么问题 // Create source and destination file streams using (var inputFileStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))

我正试图在一个c#winforms应用程序中实现一个带有进度条的文件副本。 现在只有一条线。 我发现filestream.close()上的文件传递达到了100%,并且挂起了很长时间。 目标是UNC路径

我的实现有什么问题

// Create source and destination file streams
using (var inputFileStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))
using (var outputFileStream = new FileStream(destPath + Path.GetFileNameWithoutExtension(sourceFilePath) + ".tfr", FileMode.Create))
{
    long sourceFileSize = inputFileStream.Length;
    int offset = 0;
    int bufferSize = 1024;
    var buffer = new byte[bufferSize];
    int progressPercent;

    while(offset < sourceFileSize)
    {
        // Fill buffer
        inputFileStream.Read(buffer, 0, bufferSize);

        // Empty buffer to output stream
        outputFileStream.Write(buffer, 0, bufferSize);

        // Flush buffer
        //Array.Clear(buffer, 0, buffer.Length);

        // Advance read offset
        offset += bufferSize;

        // Update GUI
        progressPercent = Convert.ToInt32(((double)offset / (double)sourceFileSize) * 100.0);
        pBar.Value = progressPercent;
        pBar.Refresh();
        labUploadStatus.Text = $"Uploading file...{progressPercent}%";
        labUploadStatus.Refresh();
    }

    outputFileStream.Close();
    inputFileStream.Close();
}
//创建源文件流和目标文件流
使用(var inputFileStream=newfilestream(sourceFilePath,FileMode.Open,FileAccess.Read))
使用(var outputFileStream=new FileStream(destPath+Path.GetFileNameWithoutExtension(sourceFilePath)+“.tfr”,FileMode.Create))
{
long sourceFileSize=inputFileStream.Length;
整数偏移=0;
int bufferSize=1024;
var buffer=新字节[bufferSize];
整数百分比;
while(偏移量<源文件大小)
{
//填充缓冲区
读取(缓冲区,0,缓冲区大小);
//输出流的空缓冲区
Write(缓冲区,0,缓冲区大小);
//刷新缓冲区
//Array.Clear(buffer,0,buffer.Length);
//预读偏移量
偏移量+=缓冲区大小;
//更新图形用户界面
progressPercent=Convert.ToInt32(((双)偏移量/(双)源文件大小)*100.0);
pBar.值=百分比;
pBar.Refresh();
labUploadStatus.Text=$“正在上载文件…{progressPercent}%”;
labUploadStatus.Refresh();
}
outputFileStream.Close();
inputFileStream.Close();
}

什么操作系统?听起来像7号窗口。尝试将扩展名从tfr更改为txt,看看是否会有所不同。也请尝试c:\valid\u sub\u文件夹位置。我不认为这是你的代码。文件有多大?您正在向USB驱动器或网络共享驱动器写入数据吗?如果文件较大且驱动器速度较慢,则将内部缓冲区刷新到磁盘可能需要一段时间。在Win8.1上运行。在我的ssd上创建了一个卷并交付到那里-无挂起。对于测试,文件只有10MB。当您说刷新内部缓冲区时,我是否正确理解整个文件可能被缓冲在某个地方,并且只有在我执行“outputFileStream.Close()时才被写入目标(网络驱动器)?@Quantum_内核是的,数据可以在操作系统的I/O缓冲区中缓冲。如果您不希望发生这种情况,请在每次调用
Write
时手动刷新写入程序。您将得到一个更真实(更慢)的如果瓶颈似乎是您的目标磁盘,则进度计数。什么操作系统?听起来像Windows 7。尝试将扩展名从tfr更改为txt,看看是否有区别。还可以尝试c:\valid\u sub\u文件夹位置。我不认为这是您的代码。文件有多大?您是否正在写入USB驱动器或网络共享驱动器?如果文件较大且驱动器速度较慢,则将内部缓冲区刷新到磁盘可能需要一段时间。在Win8.1上运行。在我的ssd上创建了一个卷并将其传递到那里-无挂起。测试时文件仅为10MB。当您说刷新内部缓冲区时,我是否正确理解整个文件可能被缓冲在某个位置,并且仅在wri中当我执行“outputFileStream.Close();”时,是否连接到目标(网络驱动器)@是的,数据可以缓冲在操作系统的I/O缓冲区中。如果不希望发生这种情况,请在每次调用
Write
时手动刷新writer。如果瓶颈是您的目标磁盘,那么您将获得一个更真实(而且更慢)的进度计数,就像它看起来的那样。