سؤال

هل تعرف لماذا لم يتم سردها بعض الملفات بواسطة هذا البرنامج، حتى لو كانت "العادية":؟

#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>

int main(void) {
  DIR *dh = opendir("./"); // directory handle
  struct dirent *file; // a 'directory entity' AKA file    
  struct stat info; // info about the file.
  while (file = readdir(dh)) {
    stat(file->d_name, &info);
    printf("note: file->d_name => %s\n", file->d_name);
    printf("note: info.st_mode => %i\n", info.st_mode);
    if (S_ISREG(info.st_mode))
      printf("REGULAR FILE FOUND! %s\n", file->d_name);
  }
  closedir(dh);

  return 0;
}

وبعد تنفيذ هذا البرنامج، أحصل على هذا:

note: file->d_name => .
note: info.st_mode => 16877
note: file->d_name => ..
note: info.st_mode => 16832
note: file->d_name => .DS_Store
note: info.st_mode => 16832
note: file->d_name => ef efeff
note: info.st_mode => 16832
note: file->d_name => ffffff
note: info.st_mode => 16832
note: file->d_name => ffffff - copie
note: info.st_mode => 16832
note: file->d_name => folder
note: info.st_mode => 16832
note: file->d_name => printiie.tt
note: info.st_mode => 16832
note: file->d_name => test.c
note: info.st_mode => 33188
REGULAR FILE FOUND! test.c
note: file->d_name => z
note: info.st_mode => 33188
REGULAR FILE FOUND! z

وكما ترون، فإن البرنامج يرى اثنين فقط الملفات. ولكن في كل ملف هو منتظم، وهناك مجلد واحد فقط.

وهنا هو الماضي نسخة من الأمر قذيفة: $ ls -lai:

total 64
2421444 drwxr-xr-x  10 denis  staff   340 27 oct 22:19 .
2416789 drwxr-xr-x@ 28 denis  staff   952 27 oct 22:20 ..
2423204 -rw-r--r--@  1 denis  staff  6148 27 oct 21:41 .DS_Store
2423206 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ef efeff
2423183 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ffffff
2423216 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ffffff - copie
2423436 drwxr-xr-x   2 denis  staff    68 27 oct 21:57 folder
2423180 -rw-r--r--@  1 denis  staff    38 27 oct 21:32 printiie.tt
2423682 -rw-r--r--@  1 denis  staff   895 27 oct 19:57 test.c
2423208 -rwxr-xr-x@  1 denis  staff    34 27 oct 21:39 z

وأود فقط لسرد اسم كل ملف، ولكن من دون أدلة. أنا أعمل على نظام التشغيل Mac OS X، ولكن لا أعتقد أن هذا يمكن أن يكون سبب المشكلة.

هل كانت مفيدة؟

المحلول

ويبدو أن وظيفة stat هو الفشل لبعض الملفات، لذلك لم يتم تحديث البنية info ولا تزال لديه البيانات فيه من "..". استبدال هذا الخط مع:

if (stat(file->d_name, &info))
{
    printf("error: stat(%s): %s\n", file->d_name, strerror(errno));
    continue;
}

و.. وسترى لماذا.

نصائح أخرى

وكان لي مرة واحدة لسرد كل ملف yml في الدليل بما في ذلك الدلائل. وكان على فوز XP: system("dir C:\Path\To\File\*.yml /B /S >> list.txt"); ثم أود أن تحليل list.txt للحصول على كل من لهم. كان سطر واحد ملف واحد. من السهل، ولكن ليس المحمولة. أيضا التي كانت منذ بعض الوقت - الآن أود أن ربما حاول دفعة

وتحرير: هذه الإجابة ليست حول رمز، ولكن:

<اقتباس فقرة>   

وفي الواقع أنا فقط أود أن إدراج اسم كل ملف، ولكن من دون أدلة.

إذا تولى نفس النهج لي، لكان قد حل مشكلته.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top