Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Tiedostolistaus DOSissa

arcatan [30.12.2002 17:39:34]

#

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

arcatan [31.12.2002 10:49:51]

#

Oho, tulipa leveä. Yllättäen kommentteja saa ja PITÄÄkin antaa.

progo [31.12.2002 10:51:47]

#

Aika sotkuista koodia, mutta näyttäisi hyvältä :)

KimmoKM [31.12.2002 10:53:19]

#

Tosiaan leveä ja sotkuinen, mutta tällaista mietinkin eilen :)

Gevil [31.12.2002 12:19:44]

#

Näkyykö muillakin noi äät ja ööt vähä väärin?

Antti Laaksonen [31.12.2002 14:06:41]

#

Nyt pitäisi näkyä suunnilleen oikein. Ja hyvältä näyttää ohjelma.

Vastaus

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

Tietoa sivustosta