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语句来包装整个函数,现在就可以工作了。我明白你在每个循环中关闭/重新打开它的意思-谢谢!