VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 776|回复: 7

文件复制问题

[复制链接]
52_avatar_middle
最佳答案
0 
在线会员 发表于 2016-9-12 22:44:02 | 显示全部楼层 |阅读模式
20驿站币
本帖最后由 eapple 于 2016-9-13 01:47 编辑

本人小菜想提问一个问题
有三个文件1.exe 2.exe 3.exe
运行1.exe之后获取当前目录三个文件然后复制到指定新创建的目录
然后退出自身
运行复制后的2.exe文件
如何写

GetModuleFileName 我只能获取一个文件,并且copy也只能copy第一次获取的
希望大神把代码写一下
让我学习

最佳答案

查看完整内容

long GetProcessDirectory(long cbBuffer,char * szBuffer) { char szDir[_MAX_PATH]; memset(szDir,0,_MAX_PATH); if(::GetModuleFileName(NULL,szDir,_MAX_PATH)) { int nCopyLen = strrchr(szDir,'\\') - szDir + 1; if(nCopyLen >= cbBuffer) return 0; memcpy(szBuffer,szDir,nCopyLen); szBuffer[nCopyLen] = 0; return strlen(szBuffer); } else { return 0; } } ...




上一篇:利用SPI技术如何过滤掉一堆制定的域名
下一篇:有没有大神会用C语言开发功能机手机的小游戏啊?有源码也可以~急需~求帮助
53_avatar_middle
最佳答案
0 
在线会员 发表于 2016-9-12 22:44:03 | 显示全部楼层
long GetProcessDirectory(long cbBuffer,char * szBuffer)
{
        char szDir[_MAX_PATH];
       
        memset(szDir,0,_MAX_PATH);
       
        if(::GetModuleFileName(NULL,szDir,_MAX_PATH))
        {
                int nCopyLen = strrchr(szDir,'\\') - szDir + 1;
                if(nCopyLen >= cbBuffer)
                        return 0;
               
                memcpy(szBuffer,szDir,nCopyLen);
                szBuffer[nCopyLen] = 0;
               
                return strlen(szBuffer);
        }
        else
        {
                return 0;
        }
}

用上面函数获得当前执行文件所在文件夹
然后搜索文件夹下的*.exe 文件

char exeFileName[_MAX_PATH];
char srcPath[_MAX_PATH];

GetModuleFileName(NULL,exeFileName,_MAX_PATH)
GetProcessDirectory(_MAX_PATH,srcPath);

WIN32_FIND_DATA wfd = {0};

char buffer[_MAX_PATH];       
sprintf(buffer,"%s\\*.exe",srcPath);
HANDLE hFind = FindFirstFile(buffer,&wfd);
if(hFind != INVALID_HANDLE_VALUE)
{
    do
    {
          sprintf(buffer,"%s\\%s",srcPath,wfd.cFileName);
          const char * dstPath = "要拷贝的路径";
          char dstFile[_MAX_PATH];
          sprintf(dstFile,"%s\\%s",dstPath,wfd.fileName);
          //拷贝文件
          Copy(buffer,dstFile);
          if(strcmp(exeFileName,buffer) != 0)
          {
             //执行你想要执行的文件
             Execute(dstFile);
          }
          if( !FindNextFile(hFind,&wfd))
          {
               break;
          }
    }while(TRUE)
    FindClose(hFind);
}
ExitProcess(0);
52_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-9-13 11:07:14 | 显示全部楼层
xieglt 发表于 2016-9-13 09:50
long GetProcessDirectory(long cbBuffer,char * szBuffer)
{
        char szDir[_MAX_PATH];

要是一个1.exe一个1.dll一个文本1.txt呢
然后复制这三个文件到CSIDL_APPDATA 2.exe 2.dll 2.txt
结束自身
运行复制到CSIDL_APPDATA目录的2.exe
53_avatar_middle
最佳答案
0 
在线会员 发表于 2016-9-13 11:27:19 | 显示全部楼层
本帖最后由 xieglt 于 2016-9-13 11:28 编辑
eapple 发表于 2016-9-13 11:07
要是一个1.exe一个1.dll一个文本1.txt呢
然后复制这三个文件到CSIDL_APPDATA 2.exe 2.dll 2.txt
结束自 ...


如果不知道文件名

sprintf(buffer,"%s\\*.exe",srcPath);  这句改成 sprintf(buffer,"%s\\*.*",srcPath);
HANDLE hFind = FindFirstFile(buffer,&wfd);

在循环里判断一下文件的后缀;
do
{
        ...
       char * pFind = strstr(wfd.cFileName,".exe");
       if(pFind != NULL && strlen(pFind) == 4)
       {
          //是exe文件
       }

       pFind = strstr(wfd.cFileName,".dll");
       if(pFind != NULL && strlen(pFind) == 4)
       {
          //是dll文件
       }

       pFind = strstr(wfd.cFileName,".txt");
       if(pFind != NULL && strlen(pFind) == 4)
       {
            //是txt文件
       }
}while(TRUE);

你知道文件名就更加简单了,不需要查找文件了。
char srcPath[_MAX_PATH];
GetProcessDirectory(_MAX_PATH,srcPath);
const char * dstPath = CSIDL_APPDATA;
char srcFile[_MAX_PATH];
char dstFile[_MAX_PATH];
sprintf(srcFile,"%s\\%s",srcPath,"1.exe");
sprintf(dstFile,"%s\\%s",dstPath,"2.exe");
CopyFile(srcFile,dstFile);
sprintf(srcFile,"%s\\%s",srcPath,"1.dll");
sprintf(dstFile,"%s\\%s",dstPath,"2.dll");
CopyFile(srcFile,dstFile);
sprintf(srcFile,"%s\\%s",srcPath,"1.txt");
sprintf(dstFile,"%s\\%s",dstPath,"2.txt");
CopyFile(srcFile,dstFile);
49_avatar_middle
最佳答案
0 
online_vip 发表于 2016-9-13 11:41:36 | 显示全部楼层
xieglt 这个哥哥已经很好的解决了你的问题,如果还不会,多想想
52_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-9-13 12:36:01 | 显示全部楼层
xieglt 发表于 2016-9-13 11:27
如果不知道文件名

sprintf(buffer,"%s\\*.exe",srcPath);  这句改成 sprintf(buffer,"%s\\*.*",srcP ...

// 1.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Windows.h"
#include <direct.h>
#include <stdio.h>

#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

#include   <shlobj.h>   
#pragma   comment(lib,   "shell32.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.
        char szCommDllPath[0x106u]={0};
        char szDllhostPath[0x106u]={0};
        SHGetSpecialFolderPathA(NULL, szCommDllPath, CSIDL_PROGRAM_FILES,FALSE);
        StrCatA(szCommDllPath,"\\Common Files");
        if (-1 == GetFileAttributesA(szCommDllPath))CreateDirectoryA(szCommDllPath,FALSE);
       
        StrCatA(szCommDllPath,"\\a.dll");
        //Dllhost.exe
        SHGetSpecialFolderPathA(NULL, szDllhostPath, CSIDL_APPDATA,FALSE);
        StrCatA(szDllhostPath,"\\aaaaaaaa");
        if (-1 == GetFileAttributesA(szDllhostPath))CreateDirectoryA(szDllhostPath,FALSE);
       
        StrCatA(szDllhostPath,"\\a.exe");
       
       
        //判断程序是否已经存在
        if(GetFileAttributesA(szDllhostPath) ==-1)
        {
                //MessageBoxA(NULL,"GetFileAttributesA","",NULL);
        //        mdzz_ServicesStart(szCommDllPath,szDllhostPath);
                for (int i=0;i<500;i++)
                {
                        printf("hello,world");
                        //system("cls");
                }
               
               
                char szSelf[0x106u]={0};
                GetModuleFileNameA(NULL,szSelf,0x106u);
                CopyFileA(szSelf,szDllhostPath,FALSE);
               
                char srcFile[_MAX_PATH];
                char dstFile[_MAX_PATH];
                sprintf(srcFile,"%s\\%s",szSelf,"1.dll");
                sprintf(dstFile,"%s\\%s",szDllhostPath,"2.dll");
                CopyFileA(srcFile,dstFile,FALSE);
                sprintf(srcFile,"%s\\%s",szSelf,"1.txt");
                sprintf(dstFile,"%s\\%s",szDllhostPath,"2.txt");
        CopyFileA(srcFile,dstFile,FALSE);
        }
        return 0;
}


这样写,不知哪里错误哦
52_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-9-13 12:36:37 | 显示全部楼层
frr 发表于 2016-9-13 11:41
xieglt 这个哥哥已经很好的解决了你的问题,如果还不会,多想想

好的,谢谢!我会多思考,
// 1.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Windows.h"
#include <direct.h>
#include <stdio.h>

#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

#include   <shlobj.h>   
#pragma   comment(lib,   "shell32.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.
        char szCommDllPath[0x106u]={0};
        char szDllhostPath[0x106u]={0};
        SHGetSpecialFolderPathA(NULL, szCommDllPath, CSIDL_PROGRAM_FILES,FALSE);
        StrCatA(szCommDllPath,"\\Common Files");
        if (-1 == GetFileAttributesA(szCommDllPath))CreateDirectoryA(szCommDllPath,FALSE);
       
        StrCatA(szCommDllPath,"\\a.dll");
        //Dllhost.exe
        SHGetSpecialFolderPathA(NULL, szDllhostPath, CSIDL_APPDATA,FALSE);
        StrCatA(szDllhostPath,"\\aaaaaaaa");
        if (-1 == GetFileAttributesA(szDllhostPath))CreateDirectoryA(szDllhostPath,FALSE);
       
        StrCatA(szDllhostPath,"\\a.exe");
       
       
        //判断程序是否已经存在
        if(GetFileAttributesA(szDllhostPath) ==-1)
        {
                //MessageBoxA(NULL,"GetFileAttributesA","",NULL);
        //        mdzz_ServicesStart(szCommDllPath,szDllhostPath);
                for (int i=0;i<500;i++)
                {
                        printf("hello,world");
                        //system("cls");
                }
               
               
                char szSelf[0x106u]={0};
                GetModuleFileNameA(NULL,szSelf,0x106u);
                CopyFileA(szSelf,szDllhostPath,FALSE);
               
                char srcFile[_MAX_PATH];
                char dstFile[_MAX_PATH];
                sprintf(srcFile,"%s\\%s",szSelf,"1.dll");
                sprintf(dstFile,"%s\\%s",szDllhostPath,"2.dll");
                CopyFileA(srcFile,dstFile,FALSE);
                sprintf(srcFile,"%s\\%s",szSelf,"1.txt");
                sprintf(dstFile,"%s\\%s",szDllhostPath,"2.txt");
        CopyFileA(srcFile,dstFile,FALSE);
        }
        return 0;
}



麻烦看一下我这样写 有哪里不对哦
53_avatar_middle
最佳答案
0 
在线会员 发表于 2016-9-13 12:45:20 | 显示全部楼层
eapple 发表于 2016-9-13 12:36
好的,谢谢!我会多思考,
// 1.cpp : Defines the entry point for the application.
//

其实,你可以设置一个断点,跟踪一下,就知道哪里出问题了

           GetModuleFileNameA(NULL,szSelf,0x106u); //这里获得的是带路径文件名 ,你必须把路径后的文件名去掉,获得路径
        
                CopyFileA(szSelf,szDllhostPath,FALSE);
               
                char srcFile[_MAX_PATH];
                char dstFile[_MAX_PATH];
              //否则,这个srcFile 就不对
                sprintf(srcFile,"%s\\%s",szSelf,"1.dll");   
                sprintf(dstFile,"%s\\%s",szDllhostPath,"2.dll");
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-12-12 21:30

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表