Šta je novo?

S_ISREG uvek vraca false?

WebWolf

Čuven
Učlanjen(a)
18.09.2004
Poruke
3,816
Poena
735
Moja oprema  
CPU & Cooler
AMD Ryzen 5600 & Scythe Mugen
Matična ploča
MSI X470 Gaming Pro Carbon
RAM
Kingston HyperX Predator 16GB 3200MHz
GPU
GeForce RTX™ 3060 Ti GAMING OC PRO 8G
Storage
Samsung 970 Evo Plus 1TB & Samsung 970 Evo Plus 500GB
PSU
Corsair RM650x
Kućište
NZXT H500
Miš & tastatura
Cooler Master MK730 & Razer Basilisk v3
Mobilni telefon
Pixel 7 Pro
Pametni uređaji
Xiaomi Roborock 6
Xiaomi Air Purifier 3H
Pristup internetu
  1. Optički internet
Ako je neko upoznat malo sa programiranjem u Linuxu, poznat mu je ovaj makro. Proverava da li je datoteka validna. Na ubuntu 10.4 apsolutno uvek vraca false rezultat... Da li je neko imao ovaj problem.

Odgovor mi znaci samo do sutra u 10:00, posle toga, don't bother :S: .

Hvala puno.
 
Da ne bi neki pocetnik pogresno protumacio, moram da dodam:
Ne proverava da li je datoteka validna, vec da li je to obican (regularan) fajl. Vraca false za direktorijume, character i blok uredjaje, fifo, sockete i ostalo...

@WebWolf
Jesi li siguran da ti nesto ne gresis? Mozes li ostaviti kod?
mozes da proveris u
/usr/include/bits/stat.h (kod mene je ta lokacija na slackware)
trebalo bi da postoji ovakva linija
Kod:
#define   __S_IFREG       0100000 /* Regular file.  */
 
Prilicno sam siguran da je tacan jer radi na drugim sistemima, reccimo neki Knoppix i Kubuntu 9.4. Samo kod mene nece.

Primetio sam jos jedan problem, mozda je to i izvor ovom drugom. Naredba stat( <ime_fajla> , <stat_bafer>) uvek vraca -1, iako ne bi trebalo tako. Mada sam citao da to sto vraca -1 nista ne znaci, pa sam izbacio tu proveru. Evo koda:
Kod:
#include  <sys/types.h>
#include  <dirent.h>
#include  <stdio.h>
#include  <sys/file.h>
#include  <sys/fcntl.h>
#include  <sys/stat.h>
int main(int argc, char* argv[])
{
        DIR* dp;
        struct dirent* dirp;
        int brdat;
        struct stat statbuf;
        int result;
        if (argc != 2)
        {
                 printf("Neophodan je jedan argument (putanja do foldera)!\n");
                 exit(1);
        }
        if ((dp = opendir(argv[1])) == NULL)
        {
                 printf("Greska prilikom otvaranja foldera %s!\n", argv[1]);
                 exit(1);
        }
        brdat = 0;
        while( (dirp = readdir(dp)) != NULL )
        {
		stat(dirp->d_name, &statbuf);
                
                 if(S_ISREG(statbuf.st_mode))
                          brdat++;
       
        }
        printf("Folder %s sadrzi %d reg. datoteka ", argv[1], brdat);
        closedir(dp);
}

Moze li da ima veze sto je Ubuntu 10.4 ext4 sistem?
 
Poslednja izmena:
Pa naravno da znaci :D
-1 znaci da komanda nije uspela iz nekog razloga :)
citas li ti man strane?

izmeni stat liniju, ovako, pa da vidimo sta je uzrok:
Kod:
if(stat(dirp->d_name, &statbuf) < 0)
   perror(dirp->d_name);
 
Poslednja izmena:
file: No such file or directory
zad2: No such file or directory
Laboratorijska vezba III-2 (Deljena memorija) - Resenja.pdf: No such file or directory
zad6ana: No such file or directory
zad6ana.c: No such file or directory
tekst: No such file or directory
sadrzaj: No such file or directory
Folder /home/sasha/kolokvijum3/vezbe/lab2 sadrzi 14 reg. datoteka

Evo ti izlaz i screenshot foldera. Zanimljivo je da radi prilicno nasumicno. Znaci neke foldere lepo prebroji, neke ne, cak imam slucajeve da za dva poziva istog foldera dobijam drugacije rezultate.
 

Prilozi

  • Screenshot.png
    Screenshot.png
    94.8 KB · Pregleda: 40
Poslednja izmena:
Znaci problem je u stat. Cudno, mozda stvarno ima veze sto je ext4 :-/
Probaj da ubacis neki flash, pa da prebrojis na njemu neki direktorijum (tamo je vfat).
 
Bice da nije ni to... Svasta... Prijavljuje opet ovo no such file or directory,
 
Koliko ja vidim problem je u tome sto se mora navesti kompletan (absolute) path za stat fju
Kod:
#include <limits.h>
...
 char path[PATH_MAX];

 while( (dirp = readdir(dp)) != NULL )
        {
          snprintf(path, PATH_MAX - 1, "%s/%s", argv[1], dirp->d_name); // 
          stat(path, &statbuf);
...
 
Jutros sam to shvatio :). U svakom slucaju hvala, izgleda da je problem resen.
 
Vrh Dno