FileStream Bytes Überschreiben
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.
-
-
-
guck dir die Klasse FileStream mal im ObjectBrowser/ObjektKatalog an, liste die Methoden und Properties, und überlege, ob für deine Zwecke was dabei ist.
-
-
-
So ich habe grad mal was zusammengecodet, ist etwas unsauber.
Löscht die angegebenen byte aus einer großen Datei:
VB.NET-Quellcode
- Private Sub RemoveDrive(ByVal c As StructureRemoveDrive)
- Dim fs As New FileStream(Resource, FileMode.Open, FileAccess.ReadWrite)
- Dim extendedPagedFile As FileStream = GetTempFile()
- For Each pt In Container
- If pt.VirtuallName = c.name Then
- Dim FileLength As Int64 = fs.Length
- Dim BytesRest As Int64 = FileLength - (pt.Pointer + pt.Count)
- Dim buffer() As Byte = New Byte(BufSize) {}
- Dim IState As New IDrive.IState
- IState.Operation = IDrive.OperationType.Delete
- fs.Position = pt.Pointer + pt.Count
- 'Datei Auslagern
- While (BytesRest > BufSize)
- fs.Read(buffer, 0, BufSize)
- extendedPagedFile.Write(buffer, 0, BufSize)
- BytesRest = (BytesRest - BufSize)
- IState.Value = Int((FileLength - BytesRest) * 100 / FileLength)
- Dispatcher.Invoke(c.handle, IState)
- End While
- fs.Read(buffer, 0, BytesRest)
- extendedPagedFile.Write(buffer, 0, BytesRest)
- 'ByteSize auf Auslagerungsdatei anpassen
- BytesRest = extendedPagedFile.Length
- extendedPagedFile.Position = 0
- fs.Position = pt.Pointer
- BackPointer(pt.Pointer, pt.Count)
- 'Datei Zusammenführen
- While (BytesRest > BufSize)
- extendedPagedFile.Read(buffer, 0, BufSize)
- fs.Write(buffer, 0, BufSize)
- BytesRest = (BytesRest - BufSize)
- IState.Value = Int((FileLength - BytesRest) * 100 / FileLength + extendedPagedFile.Length)
- Dispatcher.Invoke(c.handle, IState)
- End While
- extendedPagedFile.Read(buffer, 0, BytesRest)
- fs.Write(buffer, 0, BytesRest)
- IState.Value = 100
- Dispatcher.Invoke(c.handle, IState)
- extendedPagedFile.Close()
- FileIO.FileSystem.DeleteFile(extendedPagedFile.Name)
- fs.Close()
- Dispatcher.Invoke(Sub() Container.Remove(pt))
- Lock = False
- Exit Sub
- End If
- Next
- 'Throw New FileNotFoundException
- End Sub
-
Wenn Du im Stream manipulieren willst, sieh Dir mal System.IO.MemoryStream an.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Serow schrieb:
eine 10GB Datei
Erstelle eine bedingte Kopie Deiner Datei, lies die Quelle blockwerise ein und schreib die manipulierten Daten wieder auf Platte.
Nächster Block.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
bei deim Code habich kein Plan, welches Byte wann und wie nu gelöscht wird - kannste das noch kurz erläutern?
ich weiß auch nicht, wozu du hier einen MemoryStream einsetzen solltest -
MemoryStream, um Festplattenoperationen zu umgehen. Ist ja nun inzwischen out.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@ErfinderDesRades
Der Code ist so aufgebaut:
Nehmen wir mal an die Datei hat 3500 Bytes. Und es sollen ab dem 1000 Byte die nächsten 400 bytes entfernt werden.
Es werden zuerst 2 FileStreams geöffnet einen temporären (tmp_fs) und einen der auf die Datei mit den 3500 Bytes (fs) zeigt. Als nächstes werden vom FileStream (fs) alle Bytes nach dem 1400 (1000 + 400) Byte in dem (tmp_fs) geschrieben. Danach wird die Länge vom fs auf 1000 gesetzt und die Bytes aus dem tmp_fs wieder angefügt. Um den Arbeitsspeicher nicht voll zuschreiben werden die Kopiervorgänge mit 5120 Bytes gepuffert.
Ich hoffe ich habe das anschlich erklärt. -
also ich würde das file erstmal umkopieren bis zur ersten Lösch-Stelle, dann den Lese-Stream 400Bytes verschieben, dann weiter-kopiern.
Am Schluss das Source-File löschen, und das TempFile umbenennen. -
Also hier mal der fertige Code mit dem man Bytes in einem FileStream Überschreiben kann.
VB.NET-Quellcode
- ''' <summary>
- ''' Bytes Überschreiben
- ''' </summary>
- ''' <param name="startPos">Der Anfang der zu löschenden Bytes.</param>
- ''' <param name="Count">Die Anzahl der zu löschenden Bytes</param>
- ''' <param name="insert">Die Bytes die an dieser Stelle einzufügen sind, dieser Block wird ungepuffert geschrieben.</param>
- ''' <param name="fs">Der derzeitige FileStream.</param>
- ''' <remarks></remarks>
- Sub InsertBytes(ByVal startPos As Long, ByVal Count As Long, ByVal Insert As Byte(), ByRef fs As FileStream)
- Dim tmpfilename As String = Path.GetTempFileName
- FileIO.FileSystem.CopyFile(fs.Name, tmpfilename, True)
- Dim extendedPagedFile As New FileStream(tmpfilename, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
- 'Länge bis zur start Position setzen
- fs.SetLength(startPos)
- 'Bytes einfügen
- fs.Position = startPos
- fs.Write(Insert, 0, Insert.Length)
- 'Datei zusammenführen
- Dim FileLength As Int64 = extendedPagedFile.Length - (startPos + Count)
- Dim BytesRest As Int64 = FileLength
- Dim BufSize As Int32 = 5120
- Dim arrDaten() As Byte = New Byte((BufSize) - 1) {}
- extendedPagedFile.Position = startPos + Count
- While (BytesRest > BufSize)
- extendedPagedFile.Read(arrDaten, 0, BufSize)
- fs.Write(arrDaten, 0, BufSize)
- BytesRest = (BytesRest - BufSize)
- End While
- extendedPagedFile.Read(arrDaten, 0, BytesRest)
- fs.Write(arrDaten, 0, BytesRest)
- extendedPagedFile.Close()
- FileIO.FileSystem.DeleteFile(extendedPagedFile.Name)
- End Sub
-
du hast da immer noch 2 Kopier-Vorgänge: einmal komplett kopieren, und dann das drauf-kopieren was nach der Löschung kommt (unter überschreiben hätte ich mir vorgestellt, dass keine Bytes verschoben werden, sondern nur in einem Bereich ersetzt)
mein Ansatz läuft auf eine Umbenennung und eine Umkopierung hinaus, weil umbenennen ist viel schneller als umkopieren
Aber guck dirmal mein neuestes Experiment an:VB.NET-Quellcode
- Const bufSize As Integer = 128
- Dim buf(bufSize - 1) As Byte
- Dim read = bufSize
- Dim sFile = "C:\Programming\DotNet\VS10\VB10\A0Form\A0Form\frmA0Form - Kopie.vb"
- Using reader As New FileStream(sFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), _
- writer As New FileStream(sFile, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
- reader.Position = 200
- writer.Position = 100
- Do
- read = reader.Read(buf, 0, bufSize)
- writer.Write(buf, 0, read)
- Loop Until read < bufSize
- writer.Flush()
- writer.SetLength(writer.Position)
- End Using
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
Ähnliche Themen
-
daniel303 - - Sonstige Problemstellungen
-
3 Benutzer haben hier geschrieben
- Gast (7)
- ErfinderDesRades (5)
- RodFromGermany (3)