Windows下C/C++操作文件&文件夹的代码示例

目录

1 获取程序当前执行路径

2 获取程序当前执行路径的上一级目录

3 获取dll当前执行路径

4 获取系统临时目录路径

5 添加文件夹

6 删除文件夹

7 命令行获取当前文件夹中的所有文件名及路径

8 遍历文件夹下子目录

9 遍历文件夹下文件

10 写文件

11 读取文件大小

12 读文件 

13 拷贝文件


1 获取程序当前执行路径

/************************************************************************
        功        能:获取程序当前执行路径
        参        数:szCurrentAppPath - 程序当前执行路径
        返回值:
************************************************************************/
void WINAPI GetCurrentPath(char* szCurrentAppPath)
{
        TCHAR exeFullPath[MAX_PATH];
        char drive[_MAX_DRIVE];
        char dir[_MAX_DIR];
        //得到程序模块名称,全路径,也就是当前运行程序的全路径
        GetModuleFileName(NULL, exeFullPath, MAX_PATH); //如果是dll,则第一个参数不能为空,需要是dll句柄
        //解析路径,得到当前运行程序所在目录
        _splitpath(exeFullPath, drive, dir, NULL, NULL);
        //得到的当前运行程序所在目录
        sprintf(szCurrentAppPath, "%s%s", drive, dir);
}

2 获取程序当前执行路径的上一级目录

/************************************************************************
功 能:获取程序当前执行路径的上一级目录
参 数:szCurUpPath - 程序当前执行路径的上一级目录
返回值:
************************************************************************/
void WINAPI GetCurUpPath(char *szCurUpPath)
{
    char szCurAppPath[256] = { 0 };
    char exeFullPath[MAX_PATH];
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    //得到程序模块名称,全路径,也就是当前运行程序的全路径
    GetModuleFileName(NULL, exeFullPath, MAX_PATH);
    //解析路径,得到当前运行程序所在目录
    _splitpath(exeFullPath, drive, dir, NULL, NULL);
    //得到的当前运行程序所在目录
    sprintf(szCurAppPath, "%s%s", drive, dir);
     
    char szTmp[256] = { 0 };
    strncpy(szTmp, szCurAppPath, strlen(szCurAppPath) - 1);
    char * ext = strrchr(szTmp, '\\');
    strncpy(szCurUpPath, szTmp, strlen(szTmp) - strlen(ext));
}

3 获取dll当前执行路径

/************************************************************************
    功    能:获取dll当前执行路径
    参    数:szCurrentPath - 程序当前执行路径
    返回值:
************************************************************************/
void WINAPI GetDllPath(char *szCurrentPath)
{
    /*
    //方法1
    HINSTANCE hInst;
    ...DllMain()
    {
         case ...:
            hInst=hInstance;
    }
    //方法2,未验证
    HMODULE hInst= GetModuleHandle(_T("mydll.dll"));
*/
    char exeFullPath[MAX_PATH];
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    //得到程序模块名称,全路径,也就是当前运行程序的全路径
    GetModuleFileName(hInst,exeFullPath,MAX_PATH);
    //解析路径,得到当前运行程序所在目录
    _splitpath(exeFullPath, drive, dir, NULL,NULL);
    //得到的当前运行程序所在目录
    sprintf(szCurrentPath,"%s%s",drive, dir);
}

4 获取系统临时目录路径

char *sGetTempDir (void)
{
    static char sDir[256];
    if (sDir[0] == 0)
    {
#if _WIN32
       GetTempPath(256,sDir);     
#else
        const char *sTmpDir = getenv("TMPDIR");
        if (!sTmpDir)
            sTmpDir = getenv("TEMP");
        if (!sTmpDir)
            sTmpDir = getenv("TMP");
        if (!sTmpDir)
        sTmpDir = "/tmp";       // TODO: is this the usual way in linux environments?
         strcpy(sDir, sTmpDir);
#endif 
    }
    return sDir;
}

5 添加文件夹

/************************************************************************
        功  能:添加文件夹
        参  数:sDirName - 输入参数,文件名
        返回值:TRUE  - 成功
************************************************************************/
bool WINAPI AddDirectory(TCHAR* sDirName)
{
        WIN32_FIND_DATA fd;                      //文件夹句柄
        HANDLE hFind = FindFirstFile(sDirName, &fd);
        if ((hFind != INVALID_HANDLE_VALUE) &&
                (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
                //data目录已存在
        }
        else
        {
                CreateDirectory(sDirName, NULL);
        }
        FindClose(hFind);
        return TRUE;
}

6 删除文件夹

/************************************************************************
    功  能:删除文件夹
    参  数:sDirName - 输入参数,文件名
    返回值:TRUE  - 成功
************************************************************************/
bool DeleteDirectory(char* sDirName) 
{ 
    CFileFind tempFind; 
    char sTempFileFind[200];
    sprintf(sTempFileFind,"%s\\*.*",sDirName); 
    BOOL IsFinded = tempFind.FindFile(sTempFileFind); 
    while (IsFinded) 
    { 
        IsFinded = tempFind.FindNextFile(); 
        if (!tempFind.IsDots()) 
        { 
            char sFoundFileName[200]; 
            strcpy(sFoundFileName,tempFind.GetFileName().GetBuffer(200)); 
            if (tempFind.IsDirectory()) 
            { 
                char sTempDir[200]; 
                sprintf(sTempDir,"%s\\%s",sDirName,sFoundFileName); 
                DeleteDirectory(sTempDir); 
            } 
            else 
            { 
                char sTempFileName[200]; 
                sprintf(sTempFileName,"%s\\%s",sDirName,sFoundFileName); 
                //修改文件属性 
               SetFileAttributes(sTempFileName,FILE_ATTRIBUTE_NORMAL); 
               //删除文件
               DeleteFile(sTempFileName);                               
            } 
        } 
    } 
    tempFind.Close(); 
    if(!RemoveDirectory(sDirName)) 
    {
        return FALSE; 
    } 
    return TRUE; 
} 

7 命令行获取当前文件夹中的所有文件名及路径

dir  D:\real_foreigner_1\*.*  /b /s >FileNameList.txt    全路径
dir  D:\real_foreigner_1\*.*  /b >FileNameList.txt        文件名

8 遍历文件夹下子目录

//遍历文件夹下子目录
void WINAPI TraverseSubFolder(CString strMainFolder, CStringArray &strSubFolders, bool bFileName)
{
        //        strSubFolders.RemoveAll();
        CString   strTemp;
        CFileFind fileFinder;
        BOOL      bIsFinded = fileFinder.FindFile(strMainFolder + _T("\\*.*"));
        while (bIsFinded)
        {
                bIsFinded = fileFinder.FindNextFile();
                if (!fileFinder.IsDots())
                {
                        strTemp = fileFinder.GetFilePath();
                        if (fileFinder.IsDirectory())
                        {
                                if (bFileName == true)
                                {
                                        strTemp = strTemp.Right(strTemp.GetLength() - strMainFolder.GetLength() - 1);
                                }
                                strSubFolders.Add(strTemp);
                                //  TraverseSubFolder(strTemp);
                        }
                }
        }
        fileFinder.Close();
}

9 遍历文件夹下文件

//遍历文件夹下文件
void WINAPI TraverseSubFile(CString strPath, char *filetype, CStringArray &strSubFiles)
{
        //        strSubFiles.RemoveAll();
        CString   strTemp;
        CFileFind fileFinder;
        BOOL      bIsFinded = fileFinder.FindFile(strPath + _T("\\*.") + filetype);
        while (bIsFinded)
        {
                bIsFinded = fileFinder.FindNextFile();
                if (!fileFinder.IsDots())
                {
                        strTemp = fileFinder.GetFilePath();
                        if (fileFinder.IsDirectory())
                        {

                        }
                        else
                        {
                                strSubFiles.Add(strTemp);
                        }
                }
        }
        fileFinder.Close();
}

10 写文件

/************************************************************************
        功        能:以wb方式写文件
        参        数:szFileName - 文件名
                        buf        - 数据缓存
                        length     - 数据大小(字节数)
        返回值:1 成功    0 失败
************************************************************************/
int SaveData(char* szFileName, unsigned char *iBuf, unsigned int iLen)
{
        FILE *fp;
        fp = fopen(szFileName, "wb");
        if (!fp)
        {
                return -1;
        }
        if (fwrite(iBuf, 1, iLen, fp) != iLen)
        {
                fclose(fp);
                return -1;
        }
        fclose(fp);
        return 0;
}

11 读取文件大小

/************************************************************************
        功        能:获取文件大小
        参        数:szFileName - 文件名
        返回值:文件大小(字节数)
************************************************************************/
int GetDataSize(char* szFileName)
{
        FILE *fp;
        fp = fopen(szFileName, "rb");
        if (!fp)
        {
                return 0;
        }
        fseek(fp, 0, SEEK_END);
        int size = ftell(fp);
        fclose(fp);
        return size;
}

12 读文件 

/************************************************************************
        功        能:以rb方式读文件
        参        数:szFileName - 文件名
                        buf        - 数据缓存
                        length     - 数据大小(字节数)
        返回值:0 成功    0 失败
************************************************************************/
int WINAPI ReadData(char* szFileName, unsigned char *oBuf, int iLen)
{
        FILE *fp;
        fp = fopen(szFileName, "rb");
        if (!fp)
        {
                return -1;
        }
        fread(oBuf, 1, iLen, fp);
        fclose(fp);
        return 0;
}

13 拷贝文件

/************************************************************************
        功        能:文件拷贝
        参        数:DesFile - 目标文件名
                        SrcFile - 源文件名
        返回值:0 成功    0 失败
************************************************************************/
int WINAPI fCopy(char* DesFile, char* SrcFile)
{
        FILE *fp1, *fp2;
        int i = 0;
        if ((fp2 = fopen(SrcFile, "rb")) == NULL)
                return 0;
        if ((fp1 = fopen(DesFile, "wb")) == NULL)
        {
                fclose(fp2);
                return -1;
        }
        
        while (!feof(fp2))
        {
                fputc(fgetc(fp2), fp1);
                i++;
        }
        fclose(fp1);
        fclose(fp2);
        return 1;
}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows下配置VSCode的C/C++开发环境需要以下步骤: 1. 首先下载并安装VSCode的system版本以及MinGW-w64。 2. 打开VSCode,按下Ctrl+Shift+P调出命令面板,输入"C/C++",选择"Edit Configurations(UI)"进入配置界面。 3. 在.vscode文件夹中会自动生成一个c_cpp_properties.json文件,这个文件用于配置C/C++编译器和头文件路径等信息。 4. 接下来,在项目下创建一个cpp文件,比如helloworld.cpp,输入以下示例代码: ```cpp #include <iostream> using namespace std; int main() { cout << "Hello World" << "\n"; cout << "for vscode config"; return 0; } ``` 5. 配置tasks.json文件,用于编译C/C++代码。可以使用以下配置作为参考: ```json { "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: gcc build active file", "command": "g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] } ``` 6. 现在你可以通过点击VSCode左下角的运行按钮或者按下Ctrl+Shift+B来编译你的C/C++代码了。 通过以上步骤,你就可以在Windows下使用VSCode进行C/C++开发了。请注意,这只是一个简单的配置示例,你可以根据实际需求进行相应的修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vscode c++环境 windows配置](https://blog.csdn.net/weixin_44359953/article/details/119063174)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [windows+vscode配置C++环境](https://blog.csdn.net/weixin_48319333/article/details/127104461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值