Pobieranie nazwy pliku przez OpenFileDialog

0

Witam. Oto mój kod

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim OFD As New OpenFileDialog
        Dim fullFile() As Byte
        Try
            OFD.Filter = "Binary files (*.bin)|*.bin"
            If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then
                fullFile = File.ReadAllBytes(OFD.FileName)

**                Dim writer As New BinaryWriter(File.Open("plik.bin", FileMode.Open))**
                writer.Seek(&H5B0, SeekOrigin.Begin)
                writer.Write(CUShort(&HB1AA))
                writer.Close()
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error")
        End Try

Chciałbym, aby program pobierał plik z "Open File Dialog". Wiem, że problem jest w pogrubionej linijce. Po zmianie w tej linijce na

                Dim writer As New BinaryWriter(fullFile)

otrzymuje:

Błąd 1 Nie można przekonwertować wartości typu „1-wymiarowa tablica elementów Byte.” na „System.IO.Stream”.

Proszę o poprawienie kodu.

0

Bo musisz tam podać ścieżkę do pliku którą masz w OpenFileDialog.

0

Tak ?

          Dim writer As New BinaryWriter(OFD.OpenFile)

Teraz po otwarciu pliku otrzymuję msg.box z wiadomością

Error
Nie Można zapisać w strumieniu.

0

po co robisz ReadAllBytes?

0

Dodane, do dalszej części kodu, choć na ten czas mogę usunąć, bo jest to niepotrzebne, tak jak mówisz.

1

Raczej coś takiego powinno być. (nie testowałem, tylko tak głośno myślę)

Dim writer As New BinaryWriter(File.Open(OFD.FileName, FileMode.Open, FileAccses.ReadWrite))
0

Doczytałem trochę temat i stwierdziłem, że powinienem użyć FileStream

Teraz wygląda, to tak

   Using fs As New FileStream(OFD.FileName, FileMode.Open, FileAccess.Write, FileShare.None)
                    Using writer As New BinaryWriter(fs)

No i reszta kodu

Tylko, co zrobić, żeby program nie nadpisał istniejącego pliku tylko poprosił o zapisanie go w nowym miejscu ?

If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Using fs As New FileStream(OFD.FileName, FileMode.Open, FileAccess.Write, FileShare.None)
                Using writer As New BinaryWriter(fs)
                    writer.Seek(&H5B0, SeekOrigin.Begin)
                    writer.Write(CUShort(&HB1AA))


                    Dim SaveFileDialog As New SaveFileDialog
                    SaveFileDialog.ShowDialog()



                End Using
            End Using
        End If
1

Ale przecież jak używasz SaveFileDialog to użytkownik sam wybiera czy zapisać to w nowym pliku czy nadpisać istniejący.

0

Ale u mnie ten dialog się wcale nie chcę pojawić.
Chodzi, oto żeby oryginalny otwarty plik nie został zmieniony.

@Edit
Poprawiłem kod i okno SFD się otwiera, lecz nie zapisuje zmodyfikowanego pliku i dalej zmienia oryginalny otwarty plik.

0
ymourok3 napisał(a):

Ale u mnie ten dialog się wcale nie chcę pojawić.

Bo nie dajesz nigdzie ShowDialog

ymourok3 napisał(a):

Chodzi, oto żeby oryginalny otwarty plik nie został zmieniony.

No to chyba w SaveFileDialog trzeba wskazać wyjściowy.

0

Coś takiego ?

Dim path As String = OFD.FileName
                    Dim saveFileDialog1 As New SaveFileDialog()
                    saveFileDialog1.ShowDialog()
                    saveFileDialog1.FileName(OFD)
                    saveFileDialog1.Filter = "bin files (*.bin)|*.bin|All files (*.*)|*.*"

I ta część musi być przeniesiona przed zmianą pliku ? tak aby oryginał został nietknięty ?

0

Ty tam modyfikujesz ten plik jakoś. Pewnie trzeba by najpierw wskazany przez OpenFileDialog plik skopiować do jakiegoś temp katalogu, zmodyfikować i dopiero otworzyć SaveFileDialog. I wrzucasz mu tam tą kopię. Albo od razu każesz userowi podać dwie ścieżki w tym wypadku obejdzie się bez tempa.

0

Wracając jeszcze do samej funkcji zapisu.

            Using fs As New FileStream(OFD.FileName, FileMode.Open, FileAccess.Write, FileShare.None)
                Using writer As New BinaryWriter(fs)
                    writer.Seek(&H20, SeekOrigin.Begin)
                    writer.Write(CUShort(&H29))

                    Using writer2 As New BinaryWriter(fs)
                        writer2.Seek(&H21, SeekOrigin.Begin)
                        writer2.Write(CUShort(&H03))

Coś z tym jest nie tak i program ruszę o jeden bajt za dużo

Działa to tak

FF FF FF FF

Ma być

29 03 FF FF

A jest

29 03 00 FF

Program dopisuje 00 w trzecim bajcie. Da się to jakoś naprawić ?

@Edit
Robiąc to w jednej linijce, to zamiast 29 03 otrzymuję 03 29

writer.Write(CUShort(&H2903))

`dodanie znaczników ``` - @furious programming

1 użytkowników online, w tym zalogowanych: 0, gości: 1