Ich schreibe ein Konsolenprogramm. Ich habe den Code zu arbeiten, aber ich möchte es in eine generische Funktion ändern, um die Verwendung von verschiedenen Stream
Quellen (wie MemoryStream
) zu ermöglichen.Warum ist FileStream nicht beschreibbar?
Hier ist mein Programm:
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);
}
}
}
}
}
Ok, funktioniert gut. Nun wollen wir machen es generic:
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);
}
}
}
}
Aber ich erhalte eine Ausnahme auf der Linie: using (var writer = new MarcStreamWriter(fs2, "UTF-8"))
:
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in mscorlib.dll aufgetreten
Weitere Informationen : Stream war nicht beschreibbar.
Stack Trace
bei System.IO.BinaryWriter..ctor (Stream-Ausgang, Encoding Codierung, Boolean Leaveopen)
bei MARC4J.Net.MarcStreamWriter..ctor (Stream-Ausgang, String-Codierung, Boolean allowOversizeRecord)
bei MARC4J.Net.MarcStreamWriter..ctor (Stream-Ausgabe, String-Codierung)
bei SummonImport.Program.ConvertXmlMarcToMarc (Stream fin, Stream fout) in F: !! LocalRepository \ Libraries_Apps \ SummonImport \ Stamm/relea se \ SummonImport \ SummonImport \ Program.cs: Zeile 35
bei SummonImport.Program.Main (String [] args) in F: !! LocalRepository \ Libraries_Apps \ SummonImport \ Stamm \ Release \ SummonImport \ SummonImport \ Program.cs: Zeile 20
bei System.AppDomain._nExecuteAssembly (RuntimeAssembly Montage, String [] args)
bei System.AppDomain.ExecuteAssembly (String assembly, Evidence assemblySecurity, String [] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context (Objektzustand)
bei System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, ContextCallback Callback, Objekt s tate, Boolesche preserveSyncCtx)
bei System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, Contextcallback, Objektzustand, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, Context Rückruf, Objektzustand)
bei System.Threading.ThreadHelper.ThreadStart()
Was ist die Stack-Ablaufverfolgung? – SLaks
hinzugefügt Stack-Trace – solidau
eine Chance, die Datei als schreibgeschützt markiert ist oder der Benutzer, den Sie ausführen, hat keine Rechte zum Schreiben in die Datei? –