windows遍历目录下所有文件

 在windows中遍历目录下的所有文件主要是使用FindFirstFile和FindNextFile通过递归调用实现的,类似于Linux的opendir和readdir。

       在MSDN中,FindFirstFile的声明如下:

HANDLE FindFirstFile(
  LPCTSTR lpFileName,
  LPWIN32_FIND_DATA lpFindFileData
);

参数说明:

lpFileName
[in] A pointer to a null-terminated string that specifies a valid directory or path, and file name that can contain wildcard characters (* and ?).

If the string ends with a wildcard, period, or directory name, the user must have access to the root and all subdirectories on the path.

In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "//?/" to the path. For more information, see Naming a File.

Windows Me/98/95:  This string must not exceed MAX_PATH characters.
lpFindFileData
[out] A pointer to the  WIN32_FIND_DATA structure that receives information about a found file or subdirectory.

返回值说明:

If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile orFindClose.

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, callGetLastError.

FindNextFile:

BOOL FindNextFile(
  HANDLE hFindFile,
  LPWIN32_FIND_DATA lpFindFileData
);

Parameters
hFindFile
[in] Search handle returned by a previous call to the  FindFirstFile or  FindFirstFileEx function.
lpFindFileData
[out] Pointer to the  WIN32_FIND_DATA structure that receives information about the found file or subdirectory.

The structure can be used in subsequent calls to FindNextFile to see the found file or directory.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero (0). To get extended error information, call GetLastError.

If no matching files can be found, the GetLastError function returns ERROR_NO_MORE_FILES.

涉及的WIN32_FIND_DATA结构体的声明:

WIN32_FIND_DATA

 

The WIN32_FIND_DATA structure describes a file found by the FindFirstFileFindFirstFileEx, orFindNextFile function.

 

typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH];
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA, 
*PWIN32_FIND_DATA;
Members
dwFileAttributes
File attributes of the file found.

This member can be one or more of the following values.

AttributeMeaning
FILE_ATTRIBUTE_ARCHIVEThe file or directory is an archive file or directory.

Applications use this attribute to mark files for backup or removal.

FILE_ATTRIBUTE_COMPRESSEDThe file or directory is compressed.

For a file, this means that all of the data in the file is compressed.

For a directory, this means that compression is the default for newly created files and subdirectories.

FILE_ATTRIBUTE_DIRECTORYThe handle identifies a directory.
FILE_ATTRIBUTE_ENCRYPTEDThe file or directory is encrypted.

For a file, this means that all data in the file is encrypted.

For a directory, this means that encryption is the default for newly created files and subdirectories.

FILE_ATTRIBUTE_HIDDENThe file or directory is hidden.

It is not included in an ordinary directory listing.

FILE_ATTRIBUTE_NORMALThe file or directory does not have another attributes set.

This attribute is valid only if used alone.

FILE_ATTRIBUTE_OFFLINEThe file data is not immediately available.

This attribute indicates that the file data has been physically moved to offline storage.

This attribute is used by Remote Storage, the hierarchical storage management software.

Applications should not arbitrarily change this attribute.

FILE_ATTRIBUTE_READONLYThe file or directory is read-only.

Applications can read the file, but cannot write to it or delete it.

For a directory, applications cannot delete it.

FILE_ATTRIBUTE_REPARSE_POINTThe file or directory has an associated reparse point.
FILE_ATTRIBUTE_SPARSE_FILEThe file is a sparse file.
FILE_ATTRIBUTE_SYSTEMThe file or directory is part of the operating system, or is used exclusively by the operating system.
FILE_ATTRIBUTE_TEMPORARYThe file is being used for temporary storage.

File systems attempt to keep all of the data in memory for quick access, rather than flushing it back to mass storage.

A temporary file should be deleted by the application as soon as it is not needed.

ftCreationTime
FILETIME structure that specifies when the file or directory is created.

If the underlying file system does not support creation time, this member is 0 (zero).

ftLastAccessTime
FILETIME structure.

For a file, the structure specifies when the file is last read from, written to, or, in the case of executable files, run.

For a directory, the structure specifies when the directory is created. If the underlying file system does not support last access time, this member is 0 (zero).

On the FAT file system, the specified date for both files and directories is correct, but the time of day is always set to midnight.

ftLastWriteTime
FILETIME structure.

For a file, the structure specifies when the file is last written to, truncated, or overwritten (for example, with WriteFile or SetEndOfFile). This date and time is not updated when file attributes or security descriptors are changed.

For a directory, the structure specifies when the directory is created. If the underlying file system does not support last write time, this member is 0 (zero).
nFileSizeHigh
High-order  DWORD value of the file size, in bytes.

This value is 0 (zero) unless the file size is greater than MAXDWORD.

The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.

nFileSizeLow
Low-order  DWORD value of the file size, in bytes.
dwReserved0
If the  dwFileAttributes member includes the FILE_ATTRIBUTE_REPARSE_POINT attribute, this member specifies the reparse tag.

Otherwise, this value is undefined and should not be used.

dwReserved1
Reserved for future use.
cFileName
A null-terminated string that specifies the name of a file.
cAlternateFileName
A null-terminated string that specifies an alternative name for the file.

This name is in the classic 8.3 (filename.ext) file name format.

下面是实现的一个例子:

 

/*******************************
 *     函数名:FindFile
 *     输入参数:pFilePath(路径)
 *     输出参数:无
 *     功能
********************************
*/

void  FindFile( char   *  pFilePath)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind 
= INVALID_HANDLE_VALUE;
    
char DirSpec[MAX_PATH + 1];// 指定路径
    DWORD dwError;

    strncpy (DirSpec, pFilePath, strlen(pFilePath) 
+ 1);
    strncat (DirSpec, 
"/*"3);

    hFind 
= FindFirstFile((DirSpec, &FindFileData);

    
if (hFind == INVALID_HANDLE_VALUE)
    
{
        printf (
"Invalid file handle. Error is %u ", GetLastError());
        
return ;
    }

    
else
    
{
        
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY )
        
{
            printf (
"  %s ", FindFileData.cFileName);   //找到文件
        }

        
else if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
            
&& strcmp(FindFileData.cFileName, "."!= 0
            
&& strcmp(FindFileData.cFileName, ".."!= 0)
        
{   //找到目录
            
char Dir[MAX_PATH + 1];
            strcpy(Dir, pFilePath);
            strncat(Dir, 
"/"2);
            strcat(Dir, FindFileData.cFileName);

            FindFile(Dir);
        }


        
while (FindNextFile(hFind, &FindFileData) != 0)
        
{
            
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
            
{   //找到文件
                printf (
"  %s ", FindFileData.cFileName);
            }

            
else if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
                
&& strcmp(FindFileData.cFileName, "."!= 0
                
&& strcmp(FindFileData.cFileName, ".."!= 0)
            
{ //找到目录
                
char Dir[MAX_PATH + 1];
                strcpy(Dir, pFilePath);
                strncat(Dir, 
"/"2);
                strcat(Dir, FindFileData.cFileName);
                FindFile(Dir);
            }


        }


        dwError 
= GetLastError();
        FindClose(hFind);
        
if (dwError != ERROR_NO_MORE_FILES)
        
{
            printf (
"FindNextFile error. Error is %u ", dwError);
            
return;
        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 shell 中遍目录下的所有文件可以使用 `for` 命令。例如,如果要遍当前目录下的所有文件,可以使用以下命令: ``` for file in * do echo "$file" done ``` 这会在遍每个文件时打印文件名。您还可以使用 `find` 命令来遍目录下的所有文件。例如,要遍 `/home/user/documents` 目录下的所有文件,可以使用以下命令: ``` find /home/user/documents -type f ``` 这会列出 `/home/user/documents` 目录下所有文件的路径。您还可以使用 `find` 命令执行特定操作,例如删除或复制文件。 ``` find /home/user/documents -type f -exec rm {} \; find /home/user/documents -type f -exec cp {} /new/location \; ``` 在第一个例子中,`find` 命令会在找到每个文件时执行 `rm` 命令,并使用 `{}` 占位符表示文件的路径。在第二个例子中,`find` 命令会在找到每个文件时执行 `cp` 命令,将文件复制到新的位置。 希望这些信息对您有帮助。 ### 回答2: 在Shell编程中,可以使用`find`命令来遍目录下的所有文件。下面是一个示例的Shell脚本,可以使用`find`命令来遍目录下的所有文件并输出文件名: ```bash #!/bin/bash # 定义目标目录 target_dir="/path/to/directory" # 使用find命令遍目录下的所有文件,并输出文件名 find "$target_dir" -type f | while read -r file do echo "$file" done ``` 在这个示例中,首先通过修改`target_dir`变量来指定目标目录路径。然后使用`find`命令来遍目录下的所有文件(`-type f`表示只匹配普通文件),并将结果通过管道传递给`while`循环。`while`循环读取每个文件路径,并通过`echo`命令输出文件名。 需要注意的是,以上脚本是在Unix/Linux系统下使用的Bash Shell脚本。如果是在Windows系统下,可以使用类似的脚本,但需要使用Windows中的命令行工具,例如PowerShell或者使用`dir /s /b`命令来替代`find`命令。 希望以上解答能够帮助到您! ### 回答3: 在shell脚本中,我们可以使用循环结构和通配符来遍目录下的所有文件。 一种常用的方法是使用for循环和通配符: ```shell #!/bin/bash # 设置目标目录 dir="/path/to/directory" #遍目录下的所有文件 for file in $dir/*; do if [ -f "$file" ]; then echo "$file" fi done ``` 在上面的示例中,我们通过`$dir/*`使用通配符`*`来匹配目录下的所有文件,并将每个文件的路径存储在变量`file`中。然后,我们使用`-f`选项检查`$file`是否为一个文件,如果是,则打印该文件的路径。 另一种方法是使用find命令: ```shell #!/bin/bash # 设置目标目录 dir="/path/to/directory" #使用find命令遍目录下的所有文件 find "$dir" -type f ``` 在上面的示例中,我们使用`find "$dir" -type f`命令来递归地查找目录`$dir`下的所有文件,并打印它们的路径。 无论使用哪种方法,都可以遍目录下的所有文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值