• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            找不到 dirent.h 文件

            Posted on 2012-04-28 06:42 RTY 閱讀(9680) 評論(0)  編輯 收藏 引用 所屬分類: C/C++ 、Windows
            轉(zhuǎn)載:http://www.cnblogs.com/fzzl/archive/2009/07/14/1522913.html

            【轉(zhuǎn)】vs2005下的dirent.h  該方法同樣適用于VS2008 及VS2010

            http://www.analogcn.com/Article/wz3/200802/20080202211037.html

             

            dirent.h是gcc下的一個(gè)頭文件,而在VS2005中是沒有的。這個(gè)文件中封裝了幾個(gè)對目錄進(jìn)行操作函數(shù):

            static DIR *opendir (const char *dirname);
            static struct dirent *readdir (DIR *dirp);
            static int closedir (DIR *dirp);

             對于在linux->windows之間進(jìn)行程序移植來講常常會(huì)造成一些困擾,在網(wǎng)上仔細(xì)搜了一下,發(fā)現(xiàn)原來已經(jīng)有位好同志寫了相應(yīng)的移植代碼,如下所示:


            typedef struct dirent {
              /* name of current directory entry (a multi-byte character string) */
              char d_name[MAX_PATH + 1];

              /* file attributes */
              WIN32_FIND_DATA data;
            } dirent;


            typedef struct DIR {
              /* current directory entry */
              dirent current;

              /* is there an un-processed entry in current? */
              int cached;

              /* file search handle */
              HANDLE search_handle;

              /* search pattern (3 = zero terminator + pattern "\\*") */
              TCHAR patt[MAX_PATH + 3];
            } DIR;


            static DIR *opendir (const char *dirname);
            static struct dirent *readdir (DIR *dirp);
            static int closedir (DIR *dirp);


            /* use the new safe string functions introduced in Visual Studio 2005 */
            #if defined(_MSC_VER) && _MSC_VER >= 1400
            # define STRNCPY(dest,src,size) strncpy_s((dest),(size),(src),_TRUNCATE)
            #else
            # define STRNCPY(dest,src,size) strncpy((dest),(src),(size))
            #endif


            /*
             * Open directory stream DIRNAME for read and return a pointer to the
             * internal working area that is used to retrieve individual directory
             * entries.
             */
            static DIR*
            opendir(
                const char *dirname)
            {
              DIR *dirp;
              assert (dirname != NULL);
              assert (strlen (dirname) < MAX_PATH);

              /* construct new DIR structure */
              dirp = (DIR*) malloc (sizeof (struct DIR));
              if (dirp != NULL) {
                TCHAR *p;
               
                /* prepare search pattern */
            #ifdef _UNICODE

                /* convert directory name to wide character string */
                MultiByteToWideChar(
                    CP_ACP,                                /* code page */
                    0,                                     /* conversion flags */
                    dirname,                               /* mb-string to convert */
                    -1,                                    /* length of mb-string */
                    dirp->patt,                            /* wc-string to produce */
                    MAX_PATH);                             /* max length of wc-string */
                dirp->patt[MAX_PATH] = '\0';
               
                /* append search pattern to directory name */
                p = wcschr (dirp->patt, '\0');
                if (dirp->patt < p  &&  *(p-1) != '\\'  &&  *(p-1) != ':') {
                  *p++ = '\\';
                }
                *p++ = '*';
                *p = '\0';

            #else /* !_UNICODE */
               
                /* take directory name... */
                STRNCPY (dirp->patt, dirname, sizeof(dirp->patt));
                dirp->patt[MAX_PATH] = '\0';
               
                /* ... and append search pattern to it */
                p = strchr (dirp->patt, '\0');
                if (dirp->patt < p  &&  *(p-1) != '\\'  &&  *(p-1) != ':') {
                  *p++ = '\\';
                }
                *p++ = '*';
                *p = '\0';
               
            #endif /* !_UNICODE */

                /* open stream and retrieve first file */
                dirp->search_handle = FindFirstFile (dirp->patt, &dirp->current.data);
                if (dirp->search_handle == INVALID_HANDLE_VALUE) {
                  /* invalid search pattern? */
                  free (dirp);
                  return NULL;
                }

                /* there is an un-processed directory entry in memory now */
                dirp->cached = 1;
               
              }
              return dirp;
            }


            /*
             * Read a directory entry, and return a pointer to a dirent structure
             * containing the name of the entry in d_name field.  Individual directory
             * entries returned by this very function include regular files,
             * sub-directories, pseudo-directories "." and "..", but also volume labels,
             * hidden files and system files may be returned. 
             */
            static struct dirent *
            readdir(
                DIR *dirp)
            {
              assert (dirp != NULL);

              if (dirp->search_handle == INVALID_HANDLE_VALUE) {
                /* directory stream was opened/rewound incorrectly or it ended normally */
                return NULL;
              }

              /* get next directory entry */
              if (dirp->cached != 0) {
                /* a valid directory entry already in memory */
                dirp->cached = 0;
              } else {
                /* read next directory entry from disk */
                if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) {
                  /* the very last file has been processed or an error occured */
                  FindClose (dirp->search_handle);
                  dirp->search_handle = INVALID_HANDLE_VALUE;
                  return NULL;
                }
              }

              /* copy directory entry to d_name */
            #ifdef _UNICODE
             
              /* convert entry name to multibyte */
              WideCharToMultiByte(
                  CP_ACP,                                  /* code page */
                  0,                                       /* conversion flags */
                  dirp->current.data.cFileName,            /* wc-string to convert */
                  -1,                                      /* length of wc-string */
                  dirp->current.d_name,                    /* mb-string to produce */
                  MAX_PATH,                                /* max length of mb-string */
                  NULL,                                    /* use sys default character */
                  NULL);                                   /* don't care  */
              dirp->current.d_name[MAX_PATH] = '\0';
             
            #else /* !_UNICODE */

              /* copy as a multibyte character string */
              STRNCPY (dirp->current.d_name, dirp->current.data.cFileName, sizeof(dirp->current.d_name));
              dirp->current.d_name[MAX_PATH] = '\0';

            #endif /* !_UNICODE */
             
              return &dirp->current;
            }


            /*
             * Close directory stream opened by opendir() function.  Close of the
             * directory stream invalidates the DIR structure as well as any previously
             * read directory entry.
             */
            static int
            closedir(
                DIR *dirp)
            {
              assert (dirp != NULL);
             
              /* release search handle */
              if (dirp->search_handle != INVALID_HANDLE_VALUE) {
                FindClose (dirp->search_handle);
                dirp->search_handle = INVALID_HANDLE_VALUE;
              }

              /* release directory handle */
              free (dirp);
              return 0;
            }

            此文件可從http://www.softagalleria.net/dirent/index.en.html下載得到,直接將它放在VS2005的include目錄就OK 了!

            開網(wǎng)店http://www.5678520.com/怎么樣開網(wǎng)店

            亚洲欧洲精品成人久久曰影片| 丁香狠狠色婷婷久久综合| 久久不见久久见免费视频7| 中文字幕成人精品久久不卡| 久久久久精品国产亚洲AV无码| 亚洲国产成人久久精品影视| 91久久精品91久久性色| 久久久久99精品成人片直播| 漂亮人妻被黑人久久精品| 亚洲中文久久精品无码| 亚洲精品美女久久久久99| 国产精品99久久99久久久| 亚洲av伊人久久综合密臀性色| 久久精品国产亚洲AV不卡| 少妇熟女久久综合网色欲| 久久精品国产亚洲av麻豆图片 | 国产精品久久久久久福利69堂| 久久亚洲AV成人无码| 亚洲国产欧美国产综合久久| 久久妇女高潮几次MBA| 国产精品国色综合久久| 99久久精品免费观看国产| 日韩精品无码久久一区二区三| 久久综合久久美利坚合众国| 77777亚洲午夜久久多喷| 国内精品久久久久影院优| 夜夜亚洲天天久久| 女同久久| av无码久久久久久不卡网站| 99国内精品久久久久久久| 一级做a爰片久久毛片看看| 久久久精品人妻一区二区三区四 | 欧美成a人片免费看久久| 色狠狠久久综合网| 青青草国产精品久久久久| 日本久久久久久久久久| 久久99精品久久久久久久不卡| 99久久精品免费观看国产| 久久精品卫校国产小美女| 好久久免费视频高清| 亚洲另类欧美综合久久图片区|