Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Stream jää päälle? VB2008

Sam76 [28.12.2008 21:47:37]

#

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?

Grez [28.12.2008 23:49:40]

#

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\hiphei.rtf, jota ei tietenkään ole.

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\Datasource\DataSource\Hoblaa.rtf osaa ei löytynyt."}, josta on mielestäni aika triviaalisti pääteltävissä mikä on vikana.

neau33 [29.12.2008 20:55:34]

#

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

Sam76 [29.12.2008 22:11:19]

#

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:)

Metabolix [29.12.2008 22:23:13]

#

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

Sam76 [29.12.2008 23:37:38]

#

Kiitos, johan selvisi sekin ja koodi näyttää hyvältä :D

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta