Ongelma seuraavanlainen:
Tallennan tekstitiedoston tällä tavalla:
Dim saveFile1 As New SaveFileDialog() ' määritetään tallennettavaksi formaatiksi rtf saveFile1.DefaultExt = "*.rtf" saveFile1.Filter = "RTF Files|*.rtf" 'Lisätään tallennettavalla tekstille nimi(pvm+aika) saveFile1.FileName = Format(Now, "yyyy-M-d ") & Format(Now, "hh-mm-ss tt") If saveFile1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then Form1.RAP_kuvaus.SaveFile(saveFile1.FileName) End If
Tämä siis toimii, teksti menee talteen, että humahtaa. Mutta ongelmat alkavat kun tämän jälkeen yritän hakea tallennettua tekstiä näin(toisesta paikasta):
Dim MyFileStream As FileStream MyFileStream = New FileStream("DataSource\" + valinta + ".rtf", FileMode.Open) Form1.RAP_kuvaus.LoadFile(MyFileStream, _ RichTextBoxStreamType.RichText)
Valittaa että haluttua DataSourcea ei löydy. Valmiin tekstin haku toimii, jos en ole tallettanut mitään. Eli vaikuttaisi siltä, että tallentamisesta jää joku stream tms. päälle. Eli olisiko jollain vinkkejä että miten tätä tallentamista kannattaisi muuttaa?
Vikana on tuskin minkään streamin jääminen auki. Eihän se silloin valittaisi, että datasourcea ei löydy, vaan että sitä ei saa avattua.
Kannattaa huomata, että navigoidessasi oikeaan hakemistoon tuolla Savefiledialogilla ohjelman työskentelyhakemisto muuttuu.
Eli jos ennen tallentamista työskentelyhakemisto on ollut vaikka "C:\Sam76n_hieno_ohjelma\" ja valinta muuttuja on vaikka "hiphei" niin tuo lataava koodi lataa tiedoston C:\Sam76n_hieno_ohjelma\DataSource\hiphei.rtf.
Jos sitten tuolla savefiledialogilla menet tuonne hakemistoon C:\Sam76n_hieno_ohjelma\DataSource\ ja tallennat sinne tiedoston hiphei.rtf, niin ohjelman työskentelyhakemisto on sen jälkeen C:\Sam76n_hieno_ohjelma\DataSource\
Sitten kun yrität taas ladata tuolla jälkimmäisellä koodilla, niin se yrittääkin ladata tiedostoa C:\Sam76n_hieno_ohjelma\DataSource\DataSource\
Kannattaisi muuttaa niin, että tuo hakemisto, josta noita käytetään ei ole määritelty suhteellisesti.
Itselläni muuten noilla koodeilla (tein RAP_kuvaus objektista RichTextBoxin) antaa poikkeuksen System.IO.DirectoryNotFoundException {"Polun O:\putka\sam76\Streamjaapaalle\bin\Debug\
Heippa Sam76!
Hieman ihmettelin miksi haluasit määrittää tiedoston tallennuspolun saveFile-dialogilla ja sitten avata ko. tiedoston määrittelemällä string objektin avulla vakiohakemiston ("DataSource\" jen...) vai oliko kyseessä testi?
Mikäli et vain testaillut niin mielestäni järkevämpi vaihtoehto olisi että tallennus tapahtuisi automaattisesti vakiohakemistoon, ilman mahdollisuutta saveFile-dialogilla "sekaantumiseen/sotkemiseen"...elikä vaikkapa näin...
Imports System.IO Public Class Form1 Friend DataSourceFolder As String = String.Empty '... '... Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'esim. DataSourceFolder = _ Environment.GetFolderPath( _ Environment.SpecialFolder.ApplicationData) & "\" If FillCombo() > 0 Then ComboBox1.SelectedIndex = 0 End If End Sub Private Sub openToolStripMenuItem_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles openToolStripMenuItem.Click If richTextBox1.Rtf <> "" Then Dim fileName As String = _ DataSourceFolder + _ Format(Now, "yyyy-M-d ") + _ Format(Now, "hh-mm-ss tt").Trim + ".rtf" richTextbox1.SaveFile(fileName) Do While Dir(fileName) = "" Application.DoEvents Loop If FillCombo() > 0 Then For i As Integer = 1 To _ ComboBox1.Items.Count -1 If fileName.IndexOf(ComboBox1.Items(i)) > -1 Then ComboBox1.SelectedIndex = i Exit For End If Next End If fileName = Nothing End If End Sub Private Sub ComboBox1SelectedIndexChanged( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles ComboBox1.SelectedIndexChanged If ComboBox1.SelectedIndex = 0 Then richTextBox1.Clear Elseif ComboBox1.SelectedIndex > 0 Then ReadFileStream(DataSourceFolder & _ ComboBox1.SelectedItem.ToString & ".rtf") End If End Sub Public Sub ReadFileStream(ByVal DataSource As String) Try Dim MyFileStream As New _ FileStream(DataSource, FileMode.Open) Me.richTextBox1.LoadFile(MyFileStream, _ RichTextBoxStreamType.RichText) MyFileStream.Close MyFileStream = Nothing Catch ex As Exception End Try End Sub Public Function FillCombo() As Integer Dim sFolder As New _ System.IO.DirectoryInfo(DataSourceFolder) Dim files() As System.IO.FileInfo = _ sFolder.GetFiles("*.rtf") ComboBox1.Items.Clear If files.length > 0 Then ComboBox1.Items.Add("Ei mitään") For i As Integer = 0 To files.GetUpperBound(0) ComboBox1.Items.Add(Replace( _ files(i).ToString,".rtf","")) Next Return ComboBox1.Items.Count Else Return 0 End If sFolder = Nothing: files = Nothing End Function End Class
Kiitos vastauksista. Grez, olet aivan oikeassa, juuri tämähän on vikana. Itse pähkäilin pitkään ks. asian kanssa mutta, kun ei leikkaan niin ei leikkaa :)
Vielä jos vähän voit tarkentaa niin kertoisitko, että mitä tämä kohteen suhteellinen määrittäminen tarkoittaa? Sitäkö, että käytän kiinteitä polkuja?
Nealle: Kyllä, kysesessä oli kokeilu, joka osoittautui vähemmän toimivaksi :/ Idea oli seuraavanlainen: tekstikenttään on mahdollisuus hakea pari erilaista teksipohjaa(lomaketta). Kun käyttäjän on täyttänyt ks. pohjan, niin hän tallettaa sen toiseen tiedostoon. Tallentamisen jälkeen, käyttäjällä on mahdollisuus hakea tyhjä tekstipohja(lomake) uudelleen täytettäväksi(siis toisesta paikasta kuin mitä täytetty pohja tallennettiin). Eli toisessa paikassa sijaitsevat täytetyt pohjat ja toisessa sijaitsee erilaisia tyhjiä pohjia(lomakkeita). Haluttu tekstipohja haetaan comboboksista valitun nimen mukaan. Toteutus ei siis oikein ottanut tuulta alleen mutta idea tuntui sen verran hyvältä(??), että ajattelin kuitenkin ottaa selvää, että miten ks. juttu kannattaisi toteuttaa. Tämä sinun versiosi vaikuttaisi paljon käyttäjäystävällisemmältä ja selkeämmältä. Siinä minun tekeleessä kokonaisuus oli aikaslailla sekava, ainakin käytettävyys-näkökulmasta (ilman siis näitä lukuisia virheilmoituksiakin:). Ja kiitos koodiesimerkistä, vaikuttaa oikein mielenkiintoiselta:)
Sam76 kirjoitti:
Vielä jos vähän voit tarkentaa niin kertoisitko, että mitä tämä kohteen suhteellinen määrittäminen tarkoittaa? Sitäkö, että käytän kiinteitä polkuja?
Absoluuttinen polku alkaa Windowsissa asematunnuksesta, esimerkiksi "C:\", tai verkkopolkujen tapauksessa koneen nimestä. Suhteellinen polku taas ei ala tällaisesta, jolloin se on aina suhteessa työhakemistoon. Järkevää olisi siis muodostaa absoluuttisia polkuja. Voisit hankkia johonkin muuttujaan sen polun, josta kaikki asiat löytyvät, siis jotenkin näin:
Public Peruspolku As String = "C:\Profiilit\Pekka\Omat tiedostot\Hassut dokumentit"
Sopivia hakemistoja eri tarkoituksiin (mm. Application Data, My Documents) saa selville myös asiaankuuluvilla funktioilla, joita en tähän hätään osaa ulkoa. Sitten voisit muodostaa alihakemistojen polut tämän pääpolun avulla:
Dim Pohjat, Dokumentit As String Pohjat = Peruspolku & "/Pohjat" Dokumentit = Peruspolku & "/Dokumentit"
(Meniköhän tuo VB-koodi ihan nappiin...)
Kiitos, johan selvisi sekin ja koodi näyttää hyvältä :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.