c# - 为什么 FileStream 不可写?

标签 c#

<分区>

我正在编写一个控制台程序。我得到了可以工作的代码,但我想将其更改为通用函数以启用使用不同的 Stream 源(例如 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);
            }
        }
    }
}

但我在行中遇到异常:using (var writer = new MarcStreamWriter(fs2, "UTF-8")):

An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll
Additional information: Stream was not writable.

堆栈跟踪

at System.IO.BinaryWriter..ctor(Stream output, Encoding encoding, Boolean leaveOpen)
at MARC4J.Net.MarcStreamWriter..ctor(Stream output, String encoding, Boolean allowOversizeRecord)
at MARC4J.Net.MarcStreamWriter..ctor(Stream output, String encoding)
at SummonImport.Program.ConvertXmlMarcToMarc(Stream fin, Stream fout) in F:!!LocalRepository\Libraries_Apps\SummonImport\trunk\release\SummonImport\SummonImport\Program.cs:line 35
at SummonImport.Program.Main(String[] args) in F:!!LocalRepository\Libraries_Apps\SummonImport\trunk\release\SummonImport\SummonImport\Program.cs:line 20
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

最佳答案

在第一个示例中,您在每个循环中打开和关闭文件。

在您的第二个示例中,您没有重新打开文件,可能是当作者被处置时它正在关闭基础流。异常将在循环的第二次发生。

尝试移动 using 语句来包装 for 循环,它应该可以工作

关于c# - 为什么 FileStream 不可写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44446703/

相关文章:

c# - 检查主机是否存在的快速方法

c# - 差异文件和 Streamwriter 类

c# - 如何在 'CollectionEditor' 对话框中启用属性的默认值

c# - 以 DataGrid 作为左侧组件的 GridSplitter

c# - 从 C++ 非托管 dll 传递 C# 函数

C# with SharpZipLib - SharpZipLib 与 Winzip 和 XP 的兼容性?

c# - "Syntax error in INSERT INTO statement"如何解决

c# - .NET 事件 - 阻止订阅者订阅事件

c# - 带空值的 LINQ Max()

c# - 正在将对象引用存储在控件的 Tag 属性中 OK