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 IfTä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 ClassKiitos 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.