• <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 閱讀(9679) 評論(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/怎么樣開網店

            久久精品国产免费| 亚洲va国产va天堂va久久| 久久精品一区二区国产| 国产福利电影一区二区三区久久久久成人精品综合 | 久久亚洲熟女cc98cm| 久久精品国产99久久久古代 | 国产成人AV综合久久| 久久大香萑太香蕉av| 国产成人精品久久一区二区三区| 久久久精品免费国产四虎| 亚洲精品99久久久久中文字幕| 精品国际久久久久999波多野| 久久婷婷五月综合色99啪ak| 无码国内精品久久人妻| 久久精品国产亚洲av瑜伽| 7777久久久国产精品消防器材| 丁香狠狠色婷婷久久综合| 噜噜噜色噜噜噜久久| 国产精品VIDEOSSEX久久发布| 久久综合精品国产二区无码| 久久精品无码一区二区日韩AV| 久久精品国产亚洲av水果派| 精品久久久久久久国产潘金莲 | 久久无码人妻一区二区三区| 色婷婷久久久SWAG精品| 国产福利电影一区二区三区久久久久成人精品综合| 亚洲天堂久久久| 色99久久久久高潮综合影院| 国产精品免费看久久久香蕉| 国产亚洲精品自在久久| 久久天天躁狠狠躁夜夜网站| 久久久这里只有精品加勒比| 久久亚洲视频| 久久综合狠狠综合久久97色| 91精品观看91久久久久久| 国产91色综合久久免费| 狠狠色丁香久久婷婷综| 久久精品国产亚洲AV麻豆网站 | 伊人久久一区二区三区无码| 精品久久久久久无码国产| 国产精品九九久久免费视频|