【问题标题】:c# FileStream (FileAccess.Read) block other programs acess on .Close()c# FileStream (FileAccess.Read) 在 .Close() 上阻止其他程序访问
【发布时间】:2013-10-18 19:13:03
【问题描述】:

我有一个程序可以在播放视频文件时复制它们。

每当我在程序中关闭() FileStream 时,视频播放器(第 3 方)通常无法访问文件大约半秒(播放冻结)。

据我所知,如果我使用 Dispose() 而不是 Close() 并不重要。 文件按预期复制到新位置,所以播放冻结是我需要解决的问题,但坦率地说,我不知道第 3 方软件如何读取文件的具体细节。 我只是想不通为什么在我关闭阅读流时会出现问题。

我希望避免将复制过程推迟到视频播放器播放完毕。

任何建议将不胜感激。

FileStream SourceFile = new FileStream(sourcePath, FileMode.Open, FileAccess.Read);

while(bytesLeftToCopy > 0)
{
 int _BlockSize = 1024 * 1024;
 byte[] _BlockBuffer = new byte[_BlockSize];

 SourceFileBytes = SourceFile.Read(_BlockBuffer, 0, _BlockSize);
 //you get the idea
}
SourceFile.Close();

【问题讨论】:

  • 不清楚你在问什么?你想同时在两个程序中打开FileStream
  • 是复制失败还是视频播放失败?先调用哪个?您确定这两个操作都不会锁定文件以防止其他读取访问权限吗?
  • 对不起,我想进一步阐述
  • 有什么理由不使用File.Copy
  • 是的,该程序旨在限制复制过程的速度,以便机器上的其他进程始终有足够的资源。

标签: c# filestream


【解决方案1】:

您是否尝试过将文件流包装到使用构造中?它在执行后自动处理对象。

using (FileStream SourceFile = new FileStream(sourcePath, FileMode.Open, FileAccess.Read))
{
//read
}

【讨论】:

  • 这与使用 Close() 或 Dispose() 的工作方式不同吗?从我在 MSDN 中可以找到的情况来看,情况并非如此。
  • 我再次阅读了您的帖子,现在我明白了。您是否尝试过使用具有非默认文件共享属性的构造函数? msdn.microsoft.com/en-us/library/system.io.fileshare.aspx
  • 我会试试这个,然后回复你
  • 这个答案让我看看其他构造函数,这反过来又让我找到了答案。
【解决方案2】:

很抱歉打扰了你们,但事实证明问题出在程序的编写部分。

写这篇文章的人没有刷新写入流,这意味着当读取循环结束时会缓存大量数据。这反过来意味着在 Close() 时间使用了大量系统资源。

我切换到接受 FileOptions.WriteThough 参数的构造函数(用于写入流)。这似乎解决了问题。

感谢您提供的建议...我会在创建下一个问题时尝试更彻底。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多