使用 FileStream 作为文件的实例。在方法之间传递并处理文件
Using FileStream as a instance of a file. Passing between methods and working on the File
我正在使用一个文件处理系统,该系统会根据提示 return 向用户发送一个文件。
调用转到端点 MVC 控制器,该控制器调用辅助程序 class 中的函数,该辅助程序 return 是一个 FileStream。然后端点 return 使用 ActionResult
发送文件
文件(文件流,Mime.Type,文件名);
我在创建和处理文件的助手 class 中遇到问题。
我的目标是:
1.Create 文件
2.Write 其内容
3.Run 文件上的第三方程序(进程使用 .exe 文件)
并记录大多数操作的结果。
我想做的是创建一个创建文件的 FileStream,然后在方法之间传递 FileStream 以执行不同的工作,例如编写阅读和 运行 第 3 方程序。我还使用静态文件 classes (System.IO.File) 记录到日志文件
之前我只是创建了文件并传递了它的路径并创建了新的流对象或使用静态 classes 到 read/write 它但感觉有点丑。我感觉用一个对象作为资源更符合面向对象编程。
我的想法是不是错了,这样工作容易出错?
代码;
private DataEntity db { get; }
public string FolderPath { get; set; } //Directory for files created and log file
public string LogPath { get; set; } //Logfile path
public FileStream CreateFile(int Id, bool signFile)
{
FileType fileObject = db.FileTypes.FirstOrDefault(li => li.ID == Id);
string fileName = Path.Combine(FolderPath, fileObject.Name.Replace(" ", string.Empty) + ".lic");
using (FileStream file = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.DeleteOnClose))
{
WriteFile(fileObject , file); //Method to create the file in directory
SignOrFormatFile(fileObject , file, signFile); //Method to process the file with 3rd party .exe
try
{
file.Flush();
return file;
}
catch (Exception)
{
return null;
}
}
}
public void WriteFile(FileObject file, FileStream fileStream)
{
fileStream.Flush();
using (StreamWriter fileWriter = new StreamWriter(fileStream)) //Crashes here File is in use by other process
{
string header = fileObject.Headers; modules = fileObject.Modules;string footer = fileObject.Footer;
fileWriter.WriteLine(header + modules + footer);
fileWriter.Flush();
} //the file disapears from directory when the streamWriter exits using scope
string fileContent = System.IO.File.ReadAllText(file.Name); //Example of logging
System.IO.File.AppendAllText(LogPath, "-----------\nData:\n\n" + fileContent);
}
我在代码中的问题就是评论所描述的。
streamWriter 无法打开文件,因为它认为该文件已被另一个进程使用。
StreamWriter 在退出范围时删除文件。
fileStream.Flush();
using (StreamWriter fileWriter = new StreamWriter(fileStream)) //Crashes here File is in use by other process
这里真的没有必要刷新文件,因为还没有写入任何内容。 flush 是我能想到创建 streamWriter 会失败的唯一原因。
//the file disapears from directory when the streamWriter exits using scope
StreamWriter 将取得流的所有权,并在处理时处理它。由于您要求在关闭时删除文件,这是预期的行为。如果您想选择退出此行为,您应该使用带有 leaveopen
参数的 constructor
System.IO.File.ReadAllText(file.Name)
你为什么要读你刚刚写的东西?只需在将信息写入文件的同时将信息写入日志即可。您应该能够依靠框架 类 做他们应该做的事情。
SignOrFormatFile(fileObject , file, signFile);
您可能需要在写入文件后刷新文件。我不确定 streamwriter 在处理时是否会刷新。我不确定这是否成功,这可能取决于第三方如何处理共享文件。这可能值得一试,但您可能需要重写关闭文件的方法,然后调用第三方程序。
return file;
由于文件流位于 'using' 块中,因此文件将被释放。所以你返回的文件流对象将无法使用。目前尚不清楚您打算如何处理结果。我本来建议返回一个 FileInfo
对象,但由于您在文件关闭时将其删除,所以这也是有效的。
我正在使用一个文件处理系统,该系统会根据提示 return 向用户发送一个文件。 调用转到端点 MVC 控制器,该控制器调用辅助程序 class 中的函数,该辅助程序 return 是一个 FileStream。然后端点 return 使用 ActionResult
发送文件文件(文件流,Mime.Type,文件名);
我在创建和处理文件的助手 class 中遇到问题。
我的目标是:
1.Create 文件
2.Write 其内容
3.Run 文件上的第三方程序(进程使用 .exe 文件)
并记录大多数操作的结果。
我想做的是创建一个创建文件的 FileStream,然后在方法之间传递 FileStream 以执行不同的工作,例如编写阅读和 运行 第 3 方程序。我还使用静态文件 classes (System.IO.File) 记录到日志文件
之前我只是创建了文件并传递了它的路径并创建了新的流对象或使用静态 classes 到 read/write 它但感觉有点丑。我感觉用一个对象作为资源更符合面向对象编程。
我的想法是不是错了,这样工作容易出错?
代码;
private DataEntity db { get; }
public string FolderPath { get; set; } //Directory for files created and log file
public string LogPath { get; set; } //Logfile path
public FileStream CreateFile(int Id, bool signFile)
{
FileType fileObject = db.FileTypes.FirstOrDefault(li => li.ID == Id);
string fileName = Path.Combine(FolderPath, fileObject.Name.Replace(" ", string.Empty) + ".lic");
using (FileStream file = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.DeleteOnClose))
{
WriteFile(fileObject , file); //Method to create the file in directory
SignOrFormatFile(fileObject , file, signFile); //Method to process the file with 3rd party .exe
try
{
file.Flush();
return file;
}
catch (Exception)
{
return null;
}
}
}
public void WriteFile(FileObject file, FileStream fileStream)
{
fileStream.Flush();
using (StreamWriter fileWriter = new StreamWriter(fileStream)) //Crashes here File is in use by other process
{
string header = fileObject.Headers; modules = fileObject.Modules;string footer = fileObject.Footer;
fileWriter.WriteLine(header + modules + footer);
fileWriter.Flush();
} //the file disapears from directory when the streamWriter exits using scope
string fileContent = System.IO.File.ReadAllText(file.Name); //Example of logging
System.IO.File.AppendAllText(LogPath, "-----------\nData:\n\n" + fileContent);
}
我在代码中的问题就是评论所描述的。
streamWriter 无法打开文件,因为它认为该文件已被另一个进程使用。
StreamWriter 在退出范围时删除文件。
fileStream.Flush();
using (StreamWriter fileWriter = new StreamWriter(fileStream)) //Crashes here File is in use by other process
这里真的没有必要刷新文件,因为还没有写入任何内容。 flush 是我能想到创建 streamWriter 会失败的唯一原因。
//the file disapears from directory when the streamWriter exits using scope
StreamWriter 将取得流的所有权,并在处理时处理它。由于您要求在关闭时删除文件,这是预期的行为。如果您想选择退出此行为,您应该使用带有 leaveopen
参数的 constructor
System.IO.File.ReadAllText(file.Name)
你为什么要读你刚刚写的东西?只需在将信息写入文件的同时将信息写入日志即可。您应该能够依靠框架 类 做他们应该做的事情。
SignOrFormatFile(fileObject , file, signFile);
您可能需要在写入文件后刷新文件。我不确定 streamwriter 在处理时是否会刷新。我不确定这是否成功,这可能取决于第三方如何处理共享文件。这可能值得一试,但您可能需要重写关闭文件的方法,然后调用第三方程序。
return file;
由于文件流位于 'using' 块中,因此文件将被释放。所以你返回的文件流对象将无法使用。目前尚不清楚您打算如何处理结果。我本来建议返回一个 FileInfo
对象,但由于您在文件关闭时将其删除,所以这也是有效的。