Miten saisin toteutettua haun, joka etsisi tekstitiedostoa tietystä kansiosta ensiksi otsikoista, ja sitten tiedostojen sisällöstä? Sitten näyttäisi tulokset.
Käytössä on tuo Visual Basic Express Edition (kai).
//Etsisi siis käyttäjän syöttämällä hakusanalla.
Et tarvitse Visual Basicia. Windowsin käyttöjärjestelmässä on jo etsi-toiminto, jolla voi tehdä kyseisen haun.
No niin, tuo sisältyisi yhteen ohjelmaan... Ja onhan niitä muitakin sellaisia ohjelmia, mitkä ovat jo valmiina ja joku tekee silti...
Jos haluat ihan alusta lähteä luomaan, niin System.IO:sta löytyy tiedostofunktioita.
Itse lähtisin ratkaisemaan siten, että on yksi yleinen List-muuttuja, johon kootaan tulokset. Funktio listaisi kaikki kansiot ja tarkistaisi niiden sisällöt rekursiolla. Sen jälkeen funktio listaisi kaikki tiedostot ja suorittais haun. Jos sopii, lisätään listaan.
Uusi ongelma:
Käytän StreamReaderia tekstitiedoston lukemiseen sillä tavalla, että polku on määritelty jo valmiiksi. Pitääkö tietokoneeseen asentaa joku kirjasto, että se toimisi, koska aina kun yritän käyttää systeemiä, se valittaa, että tiedostoa ei löydy, vaikka se varmasti on siellä?
Ei, vaan teet vain jotain väärin. Kerro vielä, millaisen polun olet kirjoittanut ohjelmaan, mikä on tiedoston koko polku ja mikä on ohjelmasi koko polku.
Listboxista valitaan jokin vaihtoehto. Se merkkijono on muuttuja "valittu".
"C:\Textit\" & valittu & ".txt"
Tiedosto on toisella koneella joten en tiedä sen polkua, mutta se on se oletus eli jotakin tyyliin:
C:\Documents and Settings\EsimerkkiErkki\My Documents\Visual Basic 2008\Projekts\...?
Tuo oli ulkomuistista ja varmaankin väärin...
Oletko kokeillut debugata, mitä tiedostoa se oikeasti yrittää avata? Eli klikkaat sieltä vasemmalta breakpointin ja suoritat. Kun sitten ohjelma pysähtyy siihen kohtaan, maalaat tuon tekstin ja painat "Add Watch" tai "QuickWatch". Olethan myös tarkistanut, että tuo tiedosto on olemassa? Näyttäisitkö koodin?
Dim valittu As String Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged valittu = ListBox1.SelectedItem Dim polku As String = "C:\Textit\" & valittu & ".txt" Dim objReader As New System.IO.StreamReader(polku) TextBox1.Text = objReader.ReadToEnd objReader.Close()
Kun tuo heittää poikkeuksen, niin kopioi se leikepöydälle ja laita näkyville.
Kannattaa myös tarkastella mitä valittu pitää sisällään ja toisaalta mitä on "C:\Textit\" & valittu & ".txt", ettei vaan olisi "C:\Tekstit\{Object}.txt"
Could not find file 'C:\Textit\Esimerkki.txt'.
Tässä herää väkisinkin epäilys, että tuollaista tiedostoa ei ihan oikeasti ole käyttäjän koneella. Oletko aivan varmasti tarkistanut asian?
Juu moneen kertaan.
No ainakin polku on olemassa, meinaan tällainen tuli itsellä kun yritin ilman polkua..
System.IO.DirectoryNotFoundException was unhandled Message=Could not find a part of the path 'C:\Textit\Esimerkki.txt'. Source=mscorlib
Ja tällainen kun tiedostoa ei löydy, mutta polku on olemassa:
System.IO.FileNotFoundException was unhandled Message=Could not find file 'C:\Textit\Esimerkki.txt'. Source=mscorlib FileName=C:\Textit\Esimerkki.txt
Tuohan on ZuBerin ilmoittama virhe.
Ja sitten kun tiedosto oli olemassa, niin ei tullut virhettä.
Tiedän myös, että jos tiedosto oikeasti olisi olemassa, mutta homma ei muuten onnistuisi, niin tulisi toisenlainen virheilmoitus. Esimerkiksi jos ei ole lukuoikeutta, niin
System.UnauthorizedAccessException was unhandled Message=Access to the path 'C:\Textit\Esimerkki.txt' is denied. Source=mscorlib
Eli voisin sanoa että todennäköisyys on aika tasan 100% sen suhteen, että koneella jossa tuo virheilmoitus tuli ei ollut tuota tiedostoa.
Ja sitten jos pitäisi vielä arvata, niin siellä on tietysti joku Esimerkki.txt.txt ja koneessa on päätteiden piilotus päällä, jolloin explorer näyttää Esimerkki.txt
Grez kirjoitti:
Ja sitten jos pitäisi vielä arvata, niin siellä on tietysti joku Esimerkki.txt.txt ja koneessa on päätteiden piilotus päällä, jolloin explorer näyttää Esimerkki.txt
Kiitos paljon! Tuo auttoi! En ollut tottunu tuohon, että siihen ei pidä kirjoittaa .txt perään.
Iiiiso Kiitos, Grez!
The process cannot access the file 'C:\Tekstit\Esimerkki.txt' because it is being used by another process.
Mitäs tuo meinaa? :O
Se meinaa sitä, että jokin toinen ohjelma on lukinnut ko. tiedoston omaan käyttöönsä. Eli onkohan tiedosto auki jossain muussa ohjelmassa?
Ei pitäisi.
Entä oma ohjelmasi? Olisiko jäänyt joku streami sulkematta tms? Kannattaa myös katsoa, ettei omasta ohjelmasta ole jäänyt aiempi prosessi käyntiin vaikka olet sulkenut sen.
Kiitos! Tuo Auttoi!
Aihe on jo aika vanha, joten et voi enää vastata siihen.