Tein tälläisen ohjelman, joka tuottaa hakemistolistauksen. Siis periaatteessa niin kuin DIR. Ohjelmasta voi oppia ainakin käyttämään komentoja findfirst ja findnext.
Ohjelma on tehty ja kokeiltu DOSissa, joten en tiedä miten ylipitkät tiedostonnimet toistuvat. Se kääntyy ainakin DJGPP :llä.
Ohjelmaa käytetään siis kirjoittamalla promptiin <ohjelmannimi> <hakumääritykset>, eli vaikkapa odir tai odir "*.txt", joista ensimmäinen tulostaa kaikki hakemiston tiedostot ja jälkimmäinen kaikki hakemiston txt-tiedostot.
HUOM! Hakumääritys tulee antaa suluissa sillä command.com :lla näyttäisi olevan tapanan laajentaa esim. *.* välilyönnillä erotetuksi listaksi tiedostoja jos siinä ei ole lainausmerkkejä. Huomasin tämän vasta tehtyäni ohjelman testaillessani sitä, joten en jaksanut enää siinä vaiheessa muuttaa ohjelman rakennetta. Valitan.
#include <dir.h> #include <stdio.h> // DIR C:lle // Tehnyt: DSword <dsword@mbnet.fi> // // Koodia saa käyttää täysin vapaasti. int main(int argc, char *argv[]) { int done = 0; // muuttujia... int i; struct ffblk f; // hakutulokset tallennetaan tähän char *haku; // jos ei ole parametria, haetaan määritteellä *.* if (strcmp(argv[1], NULL) == 0) { haku = "*.*"; } else if (!strcmp(argv[1], "/?")) { // jos parametri on /? näyttetään ohje ja lopetataan printf("käyttö: odir [hakumääritys]"); return(0); } else { haku = argv[1]; } // jos parametri on, käyttetään sitä // aloitetaan haku, otetaan mukaan kaikki // tiedostot määritteistä riippumatta // ja nyt f:ssä on ensimmäisen tiedoston // tiedot. findfirst( haku, &f, FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC|FA_ARCH); // eli ensin se hakumääritys, struktuuri // johon tiedot tallennetaan ja lopuksi // määritellään, että millä atribuuteilla // varustetut tiedostot tulevat mukaan. // niin kauan kuin tiedostoja riittää tehdään seuraavaa while (!done) { // näytetään tiedoston nimi printf("%s%c", f.ff_name, 9); // sisennetään jos nimi on alle 8 merkkiä pitkä if (strlen(f.ff_name) < 8) { printf("%c", 9); } // onko tiedosto hakemisto? // jos on, ilmoitetaan asiasta if (f.ff_attrib & 0x10) { printf("<HAK>%c", 9); } // muuten kerrotaan koko else { printf("%U%c", f.ff_fsize, 9); } // tulostetaan, muttta ensin asetetaan muotoilu // sitten päivä, kuukausi, vuosi, sisennys (:D) // tunnit, minuutit printf("%02u.%02u.%04u%c%02u:%02u", (f.ff_fdate & 0x1F), (f.ff_fdate >> 5) & 0x0F, ((f.ff_fdate >> 9) & 0x7F) + 1980, 9, (f.ff_ftime >> 11) & 0x1F, (f.ff_ftime >> 5) & 0x3F); // sitten vain seuraavaan tiedostoon. done = findnext(&f); } return 0; // lopuksi tulee loppu. }
Oho, tulipa leveä. Yllättäen kommentteja saa ja PITÄÄkin antaa.
Aika sotkuista koodia, mutta näyttäisi hyvältä :)
Tosiaan leveä ja sotkuinen, mutta tällaista mietinkin eilen :)
Näkyykö muillakin noi äät ja ööt vähä väärin?
Nyt pitäisi näkyä suunnilleen oikein. Ja hyvältä näyttää ohjelma.
Aihe on jo aika vanha, joten et voi enää vastata siihen.