Visual Basic - Notatnik - nadpisanie pliku


(Jacelo) #1

Witam uprzejmie!

W VB Net zrobiłem programik na wzór systemowego Notatnika. Nie można zapisać zmian dokonanych w istniejącym i otwartym do edycji pliku; z punktu widzenia systemu, ten plik jest używany przez inny proces.

Znalazłem w Necie (a naprawdę szukam rozwiązania od wielu dni...) sugestię, aby przepisać zawartość pliku do zmiennej (utworzyłem taką zmienną - strNapis ), zamknąć plik i pracować dalej na tej zmiennej. To by zadziałało, bo istniejący na dysku plik daje się nadpisać nowym plikiem. Jednak nie potrafię zamknąć pliku nie zamykając całego programu. Polecenia Close i FileClose zwracają komunikat, że nie mogą operować na zmiennej tekstowej (ścieżka do pliku).

Kod nie jest długi, więc pozwalam sobie wkleić w całości.

Imports System.IO


Public Class Form1

    Dim strFileName As String 'deklaracja zmiennej ze ścieżką do pliku jaki zostanie wybrany do otwarcia

    Dim strNapis As String 'deklaracja zmiennej do której zostanie przepisana zawartość pliku


    'wywołuje okno "Otwórz" i wczytuje treść pliku tekstowego

    Private Sub OtrwórzToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OtrwórzToolStripMenuItem.Click


        OpenFileDialog1.InitialDirectory = "D:\" 'domyślny katalog

        OpenFileDialog1.Title = "Otwórz plik" ' tytuł okna dialogowego

        OpenFileDialog1.Filter = "Text Files|*.txt" 'jakie pliki otworzyć 

        OpenFileDialog1.ShowDialog() ' otwarcie okna dialogowego ”Otwórz plik”


        strFileName = OpenFileDialog1.FileName 'przypisuje zmiennej ścieżkę wybranego pliku


        Dim objReader As New System.IO.StreamReader(strFileName)


        strNapis = objReader.ReadToEnd ' przypisuej zmiennej zawartość pliku


        TextBox1.Text = (strNapis)


    End Sub



    'wywołuje okno "Zapisz jako..." i zapisuje treść pliku tekstowego

    Private Sub ZapiszToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZapiszToolStripMenuItem.Click


        SaveFileDialog1.InitialDirectory = "D:\," 'domyślny katalog

        SaveFileDialog1.Title = "Zapisz jako..." ' tytuł okna dialogowego

        SaveFileDialog1.Filter = "Text Files|*.txt" 'jakie pliki zapisać

        SaveFileDialog1.ShowDialog() 'otwarcie okna dialogowego "Zapisz jako..."


        strFileName = SaveFileDialog1.FileName 'przypisuje zmiennej ścieżkę wybranego pliku


        Dim objWriter As New System.IO.StreamWriter(strFileName)


        objWriter.Write(TextBox1.Text)

        objWriter.Close()


        MsgBox("Dokument zapisany!")


    End Sub


End Class

(Grzelix) #2

Trochę nie mogę uwierzyć w stwierdzenie:

, ale...

Po wpisaniu frazy visual basic notepad w google dostaje (przynajmniej ja) kilkanaście artykułów opisujących jak zrobić klon podstawowego notatnika. Są artykuły z Codeproject razem ze źródłami całego projektu a także filmiki instruktażowe na portalu youtube np ten:

w tym przykładzie zastosowano nieco inną metodę zapisu pliku.

W trakcie pisania postu zauważyłem że używasz obiektu objReader ale go nie zamykasz po przeczytaniu treści pliku. W przypadku C# (którego używam na co dzień) to spowodowałoby wyjątek że plik jest używany przez inny proces. Zacznij od tego a potem przejrzy dostępne tutoriale opisujące tego typu projekty.


(Jacelo) #3

Drogi grzelix!

Przede wszystkim bardzo dziękuję za zainteresowanie i pomoc!

Z zarzutu o powierzchowne szukanie w Google mogę spróbować wytłumaczyć się jedynie w ten sposób, że nie szukałem gotowego rozwiązania projektu Notatnik; ten mój Notesik to tylko takie ćwiczenie - m.in. właśnie po to aby nauczyć się zapisywania treści TextBox'a. Może dlatego moje poszukiwania poszły w złym kierunku i strasznie się w nich zamotałem (bo na prawdę szukałem od co najmniej tygodnia). Prośba o pomoc na forum DP była - zapewniam - ostatnią deską ratunku. Ale - oczywiście - zarzut przyjmuję z pokorą...

Wracając do tematu - oczywiście masz rację; problem był spowodowany nie zamknięciem obiektu objReader.

Teraz już wszystko gra!

Pozostaję Twoim niewypłacalnym dłużnikiem i odchodzę z forum ze wstydem ale i z radością, że mogę sobie dalej układać swoje klocki... (nigdy w życiu nie ośmieliłbym się nazwać tego co robię programowaniem). Po prostu potrzebuję stworzyć proste aplikacje okienkowe typu formularzy, które głównie posłużą do przechowywania danych wprowadzonych przez użytkownika, co najwyżej coś tam dodadzą, coś pomnożą... Troszkę liznąłem języka c++ ale dobre nauczenie się go po to, by robić projekciki o jakich wspomniałem, to trochę tak, jakby w celu zrobienia spisu zakupów iść do lasu, ściąć drzewo i wyprodukować sobie kartę papieru...

Zapewne - można to zrobić (i od dawna to mam) np, w komórkach Excel'a. Ale - jakaż satysfakcja, gdy zrobi się to w samodzielnie stworzonym programiku. No - trochę przesadziłem z tą samodzielnością; naturalnie z nieocenioną pomocą ludzi mądrzejszych i życzliwych!

Jeszcze raz - wielkie dzięki!