| 

.NET C# Java Javascript Exception

9
Wie kann ich in vb.net (VS 2008) zwei Textdateien verknüpfen?
Erste Datei immer sehr kurz (ca. 1 kB)
Zweite Datei immer sehr lang (ca. 10 MB)
Angestrebt ist ein sehr kurze Ausführungszeit.
(Stringbuilder, StreamReader-StreamWriter ???)
01.01.2012
strzata 51 2
Floyd 11,0k 3 9
4 Antworten
4
Da gibt es mehrere Möglichkeiten. Siehe: What would be the fastest way to concatenate three files in C#?
01.01.2012
Jürgen Luhr 6,9k 1 8
2
01.01.2012
Joachim 2,8k 3 9
1
Auch ich habe mich schon Länger für dieses Thema interessiert. Meine Lösung in VB:

If My.Computer.FileSystem.FileExists(target) Then FileSystem.Kill(target)
Dim outstr As String = " /c copy "
For Each name As String In qfilenames
outstr = outstr & name & " + "
Next
outstr = Strings.Left(outstr, outstr.Length - 2) & target
Dim prcinfo As New ProcessStartInfo("cmd.exe", outstr)
prcinfo.UseShellExecute = False
Dim prc As Process = Process.Start(prcinfo)
prc.WaitForExit()
02.01.2012
muffi 1,0k 9
Ich finde es unschön ein externes Programm für diese Aufgabe zu verwenden solange es effizente interene Mechanismen gibt. Selbst wenn es sich um Gigabyte-Dateien handelt, würde ich lieber entsprechende API-Aufrufe oder C++.Net-Module verwenden als vollständig aus der OOP-Weld auszubrechen und Returncodes und Output-/Error-Streams auszulesen und zu interpretieren.
Floyd 02.01.2012
Natürlich ist es nicht die schönste Lösung. Ich habe für mein Problem diverse Methoden versucht, die aber nie genau das gewünschte Ergebnis geliefert haben. Mit dem copy-Befehl marschiert das halt wunderbar. Übrigens: ja, bei mir haben die Daten in der Tat GB-Größe und nicht nur ein paar kB...
muffi 02.01.2012
1
Im GB-Bereich musste ich vor langer Zeit mal mit einigen Tools zum Splitten & Zusammenfügen experimentieren - und alle sind gescheitert.
Aus lauter Blödsinn hab ich es dann mit VBScript versucht - und es wunderbar funktioniert ;)
http://gehirnwindung.de/post/2009/03/27/Grosse-bis-riesige-Dateien-einfach-splitten-und-wieder-zusammenfuhren.aspx

Das war aber pre-.net. Heut würde ich es eher mit .net-Streams versuchen.. Die sollten doch auch mit großen Dateien umgehen können (müssen ja kaum was im Speicher halten).
copy mit + kannte ich bisher noch gar nicht - danke ;)
WolfgangKluge 02.01.2012
Ich hatte es mal mit Dateien zu tun, die 0x00 enthielten. Da konnte man sich auf das Standard Stream Handling nicht verlassen. Das ist nicht die Regel, aber wenn dann würde ich heute immer die Dateigröße/Streamsize achten - sofern sie denn bekannt ist.
So wie sich das Thema aber anhört, soll es sich hier um ein "Datenformat" handeln. In diesem Fall würde ich IMMER die größe des Header und die Größe der Daten im IM Header angeben. Z.B. 32 Byte - größe Header, weitere 32 Byte die Länge der Daten. Fest definierter Offset... Ist aber nur eine Vermutung.
Karl 02.01.2012
Hallo Wolfgang, ich habe mir das mal angesehen, bekomme aber komischerweise beim Join einen Fehler in Zeile 47 (Erlaubnis verweigert). Ich denke, das liegt an der Rechtevergabe (auf die ich leider keinen Einfluss habe). Ich werde das mal auf vb.net adaptieren und testen. Probiert hatte ich wie gesagt schon vieles (auch Streams), aber die Größe und der Inhalt der Enddatei war nie genau das gleiche Ergebnis wie der copy-Befehl. Möglicherweise bin ich da so empfindlich, weil ich viel mit Datensätze in einem festen Format arbeiten muss.
muffi 03.01.2012
@muffi: wie meinst Du "unterschiedliche Größe/Inhalt". Was genau. Und woher weißt Du, welche Wege (copy oder Streams) der beiden richtig ist?

Bei UTF-8 mit BOM weiß ich z.B. nicht, welche der beiden Wege den BOM bei der 2. Datei nicht einfügt (was ein Fehler wäre). Bei 1:1-Zusammenfügungen könnte aber genau das passieren.

Die Erlaubnis zum Schreiben einer Datei sollte das Script schon haben ;) Am besten ist es zu Testen, indem Du erstmal eine Datei splittest. Dabei entsteht ein Ordner im gleichen Verzeichnis. So ähnlich müssten die Dateien auch aussehen, wenn man wieder zusammenfügen will...
WolfgangKluge 03.01.2012
@Wolfgang: unterschiedliche Größe sehe ich einfach über die Eigenschaften der erzeugten Dateien ;-) Der Inhalt ist etwas Schwieriger. Es handelt sich hier im Daten einer Mainframe-Anwendung. Und die Mainframe reagiert sofort ziemlich genervt, sobald etwas nicht stimmt... wenn ich die Dateien mit copy kopiere, funktioniert das ohne Probleme. Bei anderen Methoden ist das Ergebnis komischerweise (meist) größer. Bislang vermute ich, dass (trotz binary) irgendwelche Umcodierungen von Codepages passieren. Copy ist immerhin ein Weg in meinem Fall, der funktioniert, immerhin :-)
muffi 03.01.2012
@muffi: Zum Testen musst Du ja keine großen Dateien nehmen - da reicht 1 Byte an sich vollkommen - nur sollten die Dateien exakt gleich gespeichert werden.

Eine Umwandlung kann eigentlich nur im Zusammenhang mit der Codepage falsch sein - entweder beim Lesen der Dateien, und/oder beim Schreiben. Wenn Du eine UTF-16-Datei mit einem ANSI-Stream ausliest und als UTF-7 speicherst, wird es zwangsläufig Müll ;)
WolfgangKluge 03.01.2012
0
Danke für die schnelle Antwort. Bleibt noch die Frage offen, wie ich den inputString bilde. Sollte ich wirklich aus der zweiten großen Datei - immerhin 10 MB - einen String machen? Darf der so lang sein? Und wenn ja, womit? Mit dem StreamReader? Ist das die schnellste Methode?
01.01.2012
strzata 51 2
Strings in der Größe würde ich generell versuchen zu vermeiden.
Ein Stream sollte ausreichen - allerdings mit eventuellen Problemen (siehe Antwort/Kommentar von muffi), die ich zwar so nicht bestätigen, aber die Zweifel eben auch nicht ganz ausräumen kann.
WolfgangKluge 03.01.2012

Stelle deine .net-Frage jetzt!