Pobieranie nazwy pliku przez OpenFileDialog

Pobieranie nazwy pliku przez OpenFileDialog
Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam. Oto mój kod

Kopiuj
    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

Kopiuj
                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.

dam1an
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1589
0

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

Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Tak ?

Kopiuj
          Dim writer As New BinaryWriter(OFD.OpenFile)

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

Error
Nie Można zapisać w strumieniu.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

po co robisz ReadAllBytes?

Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

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

dam1an
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1589
1

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

Kopiuj
Dim writer As New BinaryWriter(File.Open(OFD.FileName, FileMode.Open, FileAccses.ReadWrite))
Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

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

Teraz wygląda, to tak

Kopiuj
   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 ?

Kopiuj
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
dam1an
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1589
1

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

Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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.

dam1an
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1589
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.

Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Coś takiego ?

Kopiuj
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 ?

dam1an
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1589
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.

Y3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Wracając jeszcze do samej funkcji zapisu.

Kopiuj
            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

Kopiuj
FF FF FF FF

Ma być

Kopiuj
29 03 FF FF

A jest

Kopiuj
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

Kopiuj
writer.Write(CUShort(&H2903))

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.