teen koodia borlandin c builderilla, olen tehnyt ohjleman missä käytetään drivelistbox:ia ja directorylistbox:ia joilla käyttäjä valitsee halutun kansion. Ongelma on seuraava:
kun olen valinnut halutun kansion ja esim. tiedoston ja otan sen koodissa string muuttujaan on se esim. muotoa c:\temp\tiedoto.txt, mikä on onglemallista koska en pysty käsittelemään tätä stringmuuttujan sisältämää tiedostoa esim. _unlink komennolla että se tuhoutuisi koska unlinkissa pitää olla tiedostopolussa 2 KENOVIIVAA peräkkäin yhden sijasta! Eli jos nuo kenot olisivat tuplia niin silloin toimii, nyt ei..! turhauttavaa, sama pätee myös _findfirst ja _findnext komennoilla..!! mitä siis teen että saan tämän toimimaan? typerää olisi lähteä silmukassa yksitellen liäämään jokaiseen haettuun tietoon toiset kenoviivat.. miten tulisi toimia?
kun olen valinnut halutun kansion ja esim. tiedoston ja otan sen koodissa string muuttujaan on se esim. muotoa c:\temp\tiedoto.txt, mikä on onglemallista koska en pysty käsittelemään tätä stringmuuttujan sisältämää tiedostoa esim. _unlink komennolla että se tuhoutuisi koska unlinkissa pitää olla tiedostopolussa 2 KENOVIIVAA peräkkäin yhden sijasta! Eli jos nuo kenot olisivat tuplia niin silloin toimii, nyt ei..! turhauttavaa, sama pätee myös _findfirst ja _findnext komennoilla..!! mitä siis teen että saan tämän toimimaan? typerää olisi lähteä silmukassa yksitellen liäämään jokaiseen haettuun tietoon toiset kenoviivat.. miten tulisi toimia?
Vastaukset 6
Vanhimmat
filenamessa ois vaikka se tiedosto c:\omat\filu.txt
niin tee toinen
muuttuja johon pistät sitten saman nimen kahdella kenolla.
teet funktio joka tekee tuon muutoksen ja jota on helppo kutsua.
string lisaa_kenot(string 1)
{
replace() blaalaaaa;
return muutettu;
}
sitte vaan
while(_findnext)
{
if(jotain)
{
_ulink(lisaa_kenot(filename));
}
}
kuulostaapa omituiselta normaalisti tuota muunnosta ei tarvia koska luet directory polun suoraa komponentista, kai olet tarkistanut asian debugauksen aikana ?
kun kyseessä on borland voit käytää DeleteFile funktiota (SysUtils.hpp) ja myös FindFirst ja FindNext borlannin toteutuksina löytyy.
drivelistbox ja directorylistbox on peräisin ikivanhasta windowsin 3.11 versiosta. SelectDirectory kutsu hoitaa homman paremmin...
merkit saat muutettua parhaiten:
AnsiString uusi = StringReplace(vanha, '\\', "\\\\", TReplaceFlags()
miten niin normaalisti ei tarvita?
Koska esim. _unlink ja _findfirst tarvitsevat juuri ne tupla kenot!!
Jos otat polun komponentista muuttujaan (string) seuraavasti:
folder=DirectoryListBox1->Directory;
ja tulostat muuttujan näytölle niin ei siinä ole kuin yhdet kenot! jos koitat nyt käyttää tätä string-muuttujaa esim. _unlink:issa nii eipä toimi, mutta kun tuplaa kenot niin johan toimii!!
Eli näyttäs siltä että borland toimii näin ja sillä sipuli, minusta tuo on jotenkin niin syvältä.. lähteä nyt rakentaan tuota varten erillistä kutsuttavaa funktiota millä tuplata kenot..!!?
eipä muuten ainakaan minun borlandista löytynyt tuota DeleteFile-funktiota..!?
en kyllä ymmärrä vieläkään ymmärrä mihin niitä kaksoiskenoviivoja tarvitaan.
Ainakin itselläni toimii seuraava:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// päivitetään directory muutuja
DirectoryListBox1->OpenCurrent();
// oletetaan että hakemistossa on tiedosto nimeltä txt.txt
// Lisätään viimeinen keno koska DirextoryListBox ei sitä lisää.
AnsiString file = DirectoryListBox1->Directory "\\txt.txt";
Application->MessageBox(file.c_str(),"tuhotaan");
// delete
if (_unlink(file.c_str()) == -1)
{
Application->MessageBox(AnsiString(errno).c_str(),"VIRHE");
}
}
oletko aivan varma että et ole sekoittanut merkkiä '\\' näkyy tulostettaessa käyttäjälle merkkinä \ ja debuggeri käytää kaksoiskenoviivoja että ei sekaannu muihin merkkeihin '\t' '\e' '\n' '\r' jne... kuten myös koodissa _unlink("c:\\teksti.txt"); joka tarkoitaa selväkielisenä c:\teksti.txt
tuo DeleteFile löytyy 6 versiosta
#include
samasta paikasta löytyy myös FindFirst ja FindNext ja FindClose.
Komponenttipaletin 'Dialogs' välilehdelä on tarkoitukseen sopivia keskuskeluruutuja: 'OpenDialog', 'SaveDialog' ja 'PrintDialog'. Eiköhän niillä homma etene, kun pudotat näitä lomakkeelle.
Keskusteluruutu näytetään niille kaille yhteisellä metodilla Execute() . Vaikka esim...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->DefaultExt = "TXT"; //filtteri
OpenDialog1->FileName = "Lue minut.txt "; //jos polku niin "C:\\OmatJutut\\Testi\\Lue minut.tx"
if (OpenDialog1->Execute())
{
Memo1->Lines->LoadFromFile(OpenDialog->FileName);
Form2->Show();
}
return;
}
Luo Memo1:stä varten ihka oma kakkos-lomakke, - Form2 -, niin homma on hanskassa. Memon 'Properties' 'ReadOnly' pitää muutoksia varten olla 'false'.
Helppi kertoo esimerkeissä millaista koodia SaveToFile() ja PrintToFile() vaatii.