c# - 将 FIlestream 复制到提供空文件的新流
问题描述
我正在转换一些文件,但我在第二步遇到了一些问题。
- 从源位置加载文件
- 将文件保存到临时文件夹
- 将转换后的文件保存到输出位置
我有两种读取原始文件的方法,但它们都有问题。
- 方法1:文件保持锁定状态(所以当出现问题时,我必须重新启动应用程序)
- 方法二:临时文件为空
有人知道如何解决其中一个问题吗?
实用类
/// <summary>
/// Get document stream
/// </summary>
/// <param name="DocumentName">Input document name</param>
public static Stream GetDocumentStreamFromLocation(string documentLocation)
{
try
{
//ExStart:GetDocumentStream
// Method one: works, but locks file
return File.Open(documentLocation, FileMode.Open, FileAccess.Read);
// Method two: gives empty file on temp folder
using (FileStream fsSource = File.Open(documentLocation, FileMode.Open, FileAccess.Read))
{
var stream = new MemoryStream((int)fsSource.Length);
fsSource.CopyTo(stream);
return stream;
}
//ExEnd:GetDocumentStream
}
catch (FileNotFoundException ioEx)
{
Console.WriteLine(ioEx.Message);
return null;
}
}
/// <summary>
/// Save file in any format
/// </summary>
/// <param name="filename">Save as provided string</param>
/// <param name="content">Stream as content of a file</param>
public static void SaveFile(string filename, Stream content, string location = OUTPUT_PATH)
{
try
{
//ExStart:SaveAnyFile
//Create file stream
using (FileStream fileStream = File.Create(Path.Combine(Path.GetFullPath(location), filename)))
{
content.CopyTo(fileStream);
}
//ExEnd:SaveAnyFile
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
我调用以下函数如下:
public static StreamContent Generate(string sourceLocation)
{
// Get filename
var fileName = Path.GetFileName(sourceLocation);
// Create tempfilename
var tempFilename = $"{Guid.NewGuid()}_{fileName}";
// Put file in storage location
Utilities.SaveFile(tempFilename, Utilities.GetDocumentStreamFromLocation(sourceLocation), Utilities.STORAGE_PATH);
// ... More code
}
解决方案
经过进一步的挖掘。我发现您可以在 File.Open 中添加一个“修复”此问题的属性:
return File.Open(documentLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
缺点是您仍然无法移动/重命名文件,但锁定已被删除。
推荐阅读
- c# - 使用反射获取泛型类的实例
- javascript - 使用 Reactjs 未定义 componentDidMount 中的变量
- .net - Visual Studio 安装程序项目版本为 beta
- docker - 无法在 swarm 中运行 Apache nifi docker 容器。空响应
- php - 如何动态增加选中的区域号
- python - Python Foursquare API Checkin Add 突然开始返回
- java - java并发包中原子类的原子命名
- react-final-form - 传递类型“复选框”未使用 react-final-form 注册
- hadoop - 无法获取 Kerberos 领域
- node.js - AWS Cognito Node.JS 用户身份验证返回未知问题