• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            找不到 dirent.h 文件

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

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

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

             

            dirent.h是gcc下的一個頭文件,而在VS2005中是沒有的。這個文件中封裝了幾個對目錄進行操作函數:

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

             對于在linux->windows之間進行程序移植來講常常會造成一些困擾,在網上仔細搜了一下,發現原來已經有位好同志寫了相應的移植代碼,如下所示:


            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 了!

            開網店http://www.5678520.com/怎么樣開網店

            国产精品热久久无码av| 国产成人无码精品久久久性色| 狠狠人妻久久久久久综合蜜桃| 久久国产香蕉一区精品| 狠狠色丁香久久婷婷综合_中| 久久精品亚洲欧美日韩久久| 久久综合给久久狠狠97色| 国产一区二区久久久| 伊人色综合九久久天天蜜桃| 理论片午午伦夜理片久久 | 亚洲国产成人精品91久久久| 国产三级久久久精品麻豆三级| 亚洲精品乱码久久久久久 | 中文字幕久久精品无码| 婷婷久久精品国产| 久久综合亚洲色HEZYO社区| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲人成伊人成综合网久久久| 亚洲国产视频久久| 久久夜色精品国产噜噜亚洲a| 亚洲精品97久久中文字幕无码| 少妇久久久久久被弄到高潮| 狠狠色伊人久久精品综合网| 久久影院午夜理论片无码| 四虎亚洲国产成人久久精品| 久久天天躁夜夜躁狠狠躁2022| 国产精品99精品久久免费| 94久久国产乱子伦精品免费| 国产精品久久久99| 久久久久亚洲AV成人网人人网站| 国内精品久久久久影院免费| 伊人久久综在合线亚洲2019 | 国产美女久久精品香蕉69| 国内精品久久久久| 狠狠色丁香婷婷久久综合五月 | 青青草原综合久久大伊人导航| 97精品国产97久久久久久免费| 久久免费精品一区二区| 久久精品国产精品亚洲下载| 少妇熟女久久综合网色欲| 国产日产久久高清欧美一区|