- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在分块读取源文件并将其传递给 WCf 服务以在某些远程 SMB 上记录下来。我一直打开 FileStream,直到写入所有数据。
打开和关闭文件处理多次降低性能,所以我遵循这种方法。
写入所有数据后,我调用 CloseHandle()。然后我可能需要通过调用 DoSomeOperation() 对同一文件执行一些其他操作。因为我已经在 CloseHandle() 函数中关闭了文件句柄,但是我在 DoSomeOperation() 中收到错误“文件正在与其他进程一起使用”。如果我在延迟一段时间后调用 DoSomeOperation(),那么问题就不存在了。
请帮助我们在我调用 FileStream.Close() 时立即关闭文件句柄。
这个代码片段是一个大程序的一部分,所以我不能在这里提到所有的代码。
//In WCF service
FileStream fs = null;
public void AppendBytes(string fileName, byte[] data, long position)
{
try
{
if (fs==null)//In first call, open the file handle
fs = System.IO.File.Open(fileName, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.None);
fs.Write(data, 0, data.Length);
}
catch (Exception ex)
{
//Close handle in case of error
if (fs != null)
fs.Close();
}
}
public void CloseHandle()
{
//Close handle explicitly
if (fs != null)
fs.Close();
}
public void DoSomeOperation(string fileName)
{
using (FileStream fsO = System.IO.File.Open(fileName, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.None))
{
//Do something with file here, this is atomic operation so I am opening FileStream with 'using' to dispose at operation is over
}
}
//In client
public void CallerFunction()
{
//Read Data from sourceFile in chunk and copy to target file using WCF.AppendBytes on another machine
WCF.AppendBytes(filename, data, pos);
WCF.CloseHandle();
WCF.DoSomeOperation(filename); //I get error here that file is in use with some other process. if I put a thread.sleep(1000) just before this statement then all works fine.
}
我已经编写了一个小的测试代码来在控制台应用程序上重现相同的场景:只需从 Main() 调用 TestHandleClose(),它会在一些循环后出错。
static void TestHandleClose()
{
int i = 0;
try
{
if (File.Exists(@"d:\destination\file2.exe"))
File.Delete(@"d:\destination\file2.exe");
byte[] data = null;
int blocksize = 10 * 1024 * 1024;
for( i=0;i<100;i++)
{
using (FileStream fr = File.Open(@"d:\destination\File1.zip", FileMode.Open, FileAccess.Read, FileShare.None))
{
data = new byte[blocksize];
fr.Read(data, 0, blocksize); //We are reading the file single time but appending same data to target file multiple time.
using (FileStream f = File.Open(@"d:\destination\file2.exe", FileMode.Append, FileAccess.Write, FileShare.None))
{
f.Write(data, 0, data.Length); //We are writing same data multiple times.
f.Flush();
f.Close();
}
}
}
if (File.Exists(@"d:\destination\file2.exe"))
File.Delete(@"d:\destination\file2.exe");
}
catch (Exception ex)
{
throw;
}
}
最佳答案
最终的示例代码很有帮助,我很确定我遇到了你的问题。
问题是,即使是最新的示例代码也无法重现。但是,它显示了您可能错过的另一件事 - 您正在编写的文件是 .exe
。为什么这是个问题?好吧,有几个原因,但其中之一是当您列出 .exe
文件所在的目录时,资源管理器会继续尝试读取它(以获取图标)。在这么短的时间内,无法使用 FileShare.None
打开文件(事实上,FileShare.Read
可能也无济于事,因为打开它的人很可能没有不要指定 FileShare.ReadWrite
)。
再一次,FileStream
关闭得很好,并且运行良好(摆脱了 Flush
和 Close
调用,尽管 - 它们'浪费性能,而且没用)。问题是另一个进程试图同时读取该文件。它可能是一些文件管理器,如我的情况(Explorer、Total Commander 等),它可能是你在某个地方的一些 FileSystemWatcher
,它可能是一个病毒扫描程序(尽管现在大多数病毒扫描程序都使用卷影副本),它可能会自动为图像等创建缩略图。但是您自己发布的代码根本不会导致问题 - 其他人正在获取您的文件。
您基本上有两个选择 - 要么在您需要文件的整个过程中一直打开该文件,要么将 IOException
视为临时的并在给定的时间间隔内重试几次。无论如何,这就是您应该做的,而不是依赖快乐的路径 - 大多数读者只允许并发读取,而不是写入。
关于c# - FileStream.Close() 没有立即关闭文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30502845/
我需要对同一文件进行一批写入,但在文件内的不同位置。我想以尽可能最好的性能实现这一目标,因此查看了同步 FileStream.Write 和异步 FileStream.BeginWrite 方法。 同
MSDN说FileStream.Flush(True) “还清除所有中间文件缓冲区。”。 “所有中间文件缓冲区”到底是什么意思? 最佳答案 它会将缓冲在文件系统缓存中的文件数据写入磁盘。该数据通常是根
考虑以下摘自 Microsoft docs 的代码: using FileStream createStream = File.Create(fileName); // ...write to str
我对Spark的理解fileStream()方法是将三种类型作为参数:Key , Value , 和 Format .对于文本文件,适当的类型是:LongWritable , Text , 和 Tex
为什么 FileStream.Length 是 long 类型,但 FileStream.Read 参数 - offset 有更短的长度 int 呢? 布莱恩 最佳答案 offset 参数告诉从哪里开
我编写了以下程序,其目的是创建一个给定大小的文件,其中包含一些随机数据。该程序运行良好,并完成了它应该做的事情。但是,我不明白为什么它会消耗 5GB 的 RAM(请参阅我的任务管理器的屏幕截图)。当我
我在一次采访中被问到这个问题,我说答案是 Managed。面试官似乎很惊讶。我的问题是即使它访问一个文件( native /非托管资源),但这个类不是托管的吗?或者你认为我应该有一些后续问题以获得更多
我正在编写一些代码作为打开文件框架的一部分。该文件属于自定义类型,不应由我的应用程序的多个实例打开。为了停止打开多个文件,我使用文件流创建一个锁定文件,然后保持所述文件流打开。 这似乎可以防止我的应用
我正在使用 Apache Commons Net 的 FTPClient 从位于服务器上的文件中读取内容。仅读取一次时效果很好。但是当我尝试读取第二个文件时,FTPClient 的 InputStre
问题 有没有办法在 C# 中创建带偏移量的 FileStream?例如,如果我在偏移量 100 处打开 SomeFile.bin,Stream.Position 将等于 0,但读取和写入将偏移 100
我正在阅读一个简单的文本文件,其中包含使用文件流类的单行。但似乎 filestream.read 在开头添加了一些垃圾字符。 代码下方。 using (var _fs = File.Open(_idF
我正在使用 FileStream 将 FTP 服务器的信息下载到我的 C:\驱动器上的目录中。出于某种原因,即使我什至尝试将目录权限设置为“所有人”访问权限,它也给了我这个异常(exception):
我正在尝试通过将文件作为参数的 API 上传 .srt 文件。 文件存储在服务器上,我正在使用 FileStream 和 StreamWriter 写入: string path = Server.M
我四处搜索了一下,但找不到能完美解决我的问题的东西。我有一些代码,即来 self 的数据库的 FileStream varbinary,并将其制作成客户端计算机上的文件,双击时可以在文件类型的默认应用
我最近在做一个涉及很多FileStreaming 的项目,这是我以前没有真正接触过的。 为了尝试更好地熟悉这些方法的原理,我编写了一些代码(理论上)将文件从一个 dir 下载到另一个,并逐步完成,在我
我通过例如下载文件5 个线程。当其中一个线程完成下载文件部分时 - 它被中止,但所有其余线程都有 ThreadState = WaitSleepJoin 并且显然停止下载。如何解决? while ((
我试图将 5 GB 的 ISO 文件复制到具有 29 GB 可用空间的 32 GB 闪存驱动器上。 Windows 7 拒绝让我拖放文件到闪存驱动器,报告文件对于目标文件系统来说太大了。 我最终了解到
我发现将 BufferedStream 与 FileStream 结合使用没有意义,因为它有自己的缓冲策略。然而,我想知道一件事: FileStream fsWithBuffer = new File
我有一个只读的 FileStream,它是一个方法局部变量: public void SomeMethod() { var fileStream = File.Open(fileName, Fi
我有两个文件流,它们从不同的文件中收集不同的信息: FileStream dataStruc = new FileStream("c:\\temp\\dataStruc.txt", FileMode.
我是一名优秀的程序员,十分优秀!