C# 为什么FileStream不可写?
我正在写一个控制台程序。我让代码正常工作,但我想将其更改为一个通用函数,以便能够使用不同的C# 为什么FileStream不可写?,c#,C#,我正在写一个控制台程序。我让代码正常工作,但我想将其更改为一个通用函数,以便能够使用不同的流源(例如MemoryStream) 以下是我的节目: private static void Main(string[] args) { using (var fs = new FileStream("f:\\!temp\\marcXmlRecords.mxml", FileMode.Open)) { var reader = new MarcXmlReader().Rea
流
源(例如MemoryStream
)
以下是我的节目:
private static void Main(string[] args)
{
using (var fs = new FileStream("f:\\!temp\\marcXmlRecords.mxml", FileMode.Open))
{
var reader = new MarcXmlReader().Read(fs);
foreach (var record in reader)
{
var leader = record.Leader;
var controlFields = record.GetControlFields();
var dataFields = record.GetDataFields();
var allFields = record.GetVariableFields();
using (var fs2 = new FileStream("f:\\!temp\\marcRecords.mrc",
FileMode.OpenOrCreate))
{
using (var writer = new MarcStreamWriter(fs2, "UTF-8"))
{
var wrecord = MarcFactory.Instance.NewRecord();
wrecord.Leader = record.Leader;
foreach (var cfield in controlFields)
{
wrecord.AddVariableField(cfield);
}
foreach (var dfield in dataFields)
{
wrecord.AddVariableField(dfield);
}
foreach (var afield in allFields)
{
wrecord.AddVariableField(afield);
}
writer.Write(wrecord);
}
}
}
}
}
好的,很好用。现在让我们让它更通用:
internal class Program
{
private static void Main(string[] args)
{
using (var fs = new FileStream("f:\\!temp\\marcXmlRecords.mxml", FileMode.Open))
{
using (var fs2 = new FileStream("f:\\!temp\\marcRecords.mrc",
FileMode.OpenOrCreate))
{
ConvertXmlMarcToMarc(fs, fs2);
}
}
}
private static void ConvertXmlMarcToMarc(Stream fin, Stream fout)
{
var reader = new MarcXmlReader().Read(fin);
foreach (var record in reader)
{
var leader = record.Leader;
var controlFields = record.GetControlFields();
var dataFields = record.GetDataFields();
var allFields = record.GetVariableFields();
using (var writer = new MarcStreamWriter(fout, "UTF-8"))
{
var wrecord = MarcFactory.Instance.NewRecord();
wrecord.Leader = record.Leader;
foreach (var cfield in controlFields)
{
wrecord.AddVariableField(cfield);
}
foreach (var dfield in dataFields)
{
wrecord.AddVariableField(dfield);
}
foreach (var afield in allFields)
{
wrecord.AddVariableField(afield);
}
writer.Write(wrecord);
}
}
}
}
但我在这一行遇到了一个例外:使用(var writer=new MarcStreamWriter(fs2,“UTF-8”)
:
mscorlib.dll中发生“System.ArgumentException”类型的未处理异常其他信息:流不可写 堆栈跟踪 在System.IO.BinaryWriter..ctor(流输出、编码、布尔值打开)
在MARC4J.Net.MarcStreamWriter..ctor(流输出、字符串编码、布尔AllowVersionRecord)
在MARC4J.Net.MarcStreamWriter..ctor(流输出,字符串编码)
在F:中调用import.Program.ConvertXmlMarcToMarc(Stream-fin,Stream-fout)!!LocalRepository\Libraries\u Apps\callimport\trunk\release\callimport\callimport\Program.cs:第35行
在F:!!中的import.Program.Main(字符串[]args)处!!LocalRepository\Libraries\u Apps\callimport\trunk\release\callimport\callimport\Program.cs:第20行
位于System.AppDomain.\u nExecuteAssembly(RuntimeAssembly程序集,字符串[]args)
位于System.AppDomain.ExecuteAssembly(字符串汇编文件、证据汇编安全性、字符串[]args)
在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()上
位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态)
位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔保存SyncCTX)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
位于System.Threading.ThreadHelper.ThreadStart()处 您需要采用
FileAccess
参数的:
using (var fs2 = new FileStream("f:\\!temp\\marcRecords.mrc", FileMode.OpenOrCreate, FileAccess.Write))
FileMode.OpenOrCreate本身不足以使其可写:
指定操作系统应打开文件(如果存在);否则,应创建一个新文件。如果文件是使用FileAccess.Read打开的,则需要FileIOPermissionAccess.Read权限。如果文件访问权限为FileAccess.Write,则需要FileIOPermissionAccess.Write权限。如果使用FileAccess.ReadWrite打开文件,则需要FileIOPermissionAccess.Read和FileIOPermissionAccess.Write权限
在第一个示例中,在每个循环上打开和关闭文件
在第二个示例中,您没有重新打开文件,很可能是当释放writer时,它正在关闭底层流。异常将在循环的第二次发生
尝试移动using语句来包装for循环,它应该可以工作堆栈跟踪是什么?添加的堆栈跟踪可能文件被标记为只读,或者您正在运行的用户没有写入该文件的权限?它不是只读的,我也有权限。我可以用第一种方法多次运行它,但只要我移动using语句,它就会崩溃。我尝试添加它,但仍然得到异常。@solidau我无法复制错误。使用调试器检查fs2。在调用函数之前,可以编写。它为我显示了True
。也许这是您的MarcStreamWriter
构造函数所做的任何事情中的一个问题?CanWrite=true hmmmmm。。。如果我在之前使用
将
放入构造函数,则构造函数可以正常工作。我不希望您遇到麻烦,但是FWIW它是nuget包Marc4J.NETOK,我移动了MarcStreamWriter
using语句来包装整个函数,现在就可以工作了。我明白你在每个循环中关闭/重新打开它的意思-谢谢!