Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Ensimmäinen vapaa tiedosto

sqwiik [02.06.2004 13:07:35]

#

Silloin tällöin, tehdessä jotain väliaikaisia ym tiedostoja, saattaa tulla tuhonneeksi jonkin toisen ohjelman väliaikaisen tiedoston, jos ne sattuivat olemaan samannimisiä eikä jonpikumpi ohjelma tarkista voiko luoda omaa väliaikaistaan.

Seuraava funktio palauttaa halutulla päätteellä sen nimisen tiedostonimen, jollaista EI ole olemassa kotikansiossa. Ihan kätevä, jos ei halua vaivata ajatuksiaan temp-tiedoston nimen kanssa. Eli toisin sanoen selaa kirjaimia, alkaen vaikka aaaaaaaa.txt, sitten aaaaaaab.txt jne...

Ottaa parametreiksi halutun päätteen ja merkkijono, johon tulos sijoitetaan (palauttaa myös pointterin tulokseen, vrt. strcpy, strcat jne). Käytän koodatessani miltei puhdasta C:tä, joten ei sanaakaan C++:sta (kiitos).

Funktio tuottaa DOS-sopivia nimiä (8 merkkiä+3-merkkinen pääte).

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * FreeTempFile(char * paate, char * tulos){
signed int a, loytyi = 0;
FILE * tiedosto;
char nimi[10] = "AAAAAAAA", fnimi[13];
  if(tulos == NULL || paate == NULL)return NULL;
  if(strlen(paate) > 3)return NULL;
  while(strcmpr(nimi, "AAAAAAAA")){
    sprintf(fnimi, "%s.%s", nimi, paate);
    tiedosto = fopen(fnimi, "r");
    if(tiedosto == NULL){fclose(tiedosto);loytyi = 1;break;} //ei löydy (tai ei voi avata)
    fclose(tiedosto);
    //Pyöritetään kirjaimia A->Z
    nimi[0] += 1;
    for(a=0;a<8;a++){
      if(nimi[a] > 'Z'){
        if(a<7){
          nimi[a+1] += 1;
          nimi[a] = 'A';
        }else break; //veke
      }
    }
  }
  if(loytyi){
    sprintf(tulos, "%s.%s", nimi, paate);
    return tulos;
  }else{tulos = NULL; return NULL;}
}

Esimerkki

int main(){
char filu[13];
  printf("Tiedosto: %s", FreeTempFile("txt", filu));
  //Nyt filu-nimeä voisi käytellä...
  return 0;
}

Meitzi [02.06.2004 23:18:23]

#

Toinen tapa on sitte pyytä vapaa temp tiedostonimi Windowsin API kutsulla.

Anzuhan [06.06.2004 23:20:14]

#

Tai käyttää standardeja tmpfile-kutsuja.

Vastaus

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

Tietoa sivustosta