Win32 API CopyFile () не может отправить несколько файлов - PullRequest
0 голосов
/ 02 августа 2009

При попытке использовать функцию CopyFile () я обнаружил странную ошибку. Он не будет записывать ни один из файлов в мой пункт назначения.

Вот код. Раздел, когда я отправляю файлы, был прокомментирован. Имейте в виду, что этот код является черновиком, поэтому игнорируйте определения функций.

/*



*/


#include <stdio.h>
#include <windows.h>
#include <dirent.h>

char* getPath();
char* combineStrings(char* profile, char* path);
char** findProfile(char* path);
void copyagain();




int main()
{ 
    int fileIndex;
    char* fileLocation     = getPath();  
    char* whereAmI         = _getcwd(NULL,0);
    char **files           = findProfile(fileLocation);
    char* filesToExport[3] = {"\\formhistory.sqlite","\\cookies.sqlite", "\\downloads.sqlite"};
    char* profileName      = files[2];
    char* partPath         = strncat(fileLocation,"\\",3);
    char* pathWoutFile     = strncat(fileLocation,profileName,strlen(profileName) + 1);
    char* fullPathWithFile;
    char* fullSendPath;

    char* downloads = "\\downloads.sqlite";
    char* cookies   = "\\cookies.sqlite";
    char* history   = "\\formhistory.sqlite";







     char* from1 = strncat(fileLocation,filesToExport[0],100);
     char* send1 = strncat(whereAmI,filesToExport[0],100);


      char* from2 = strncat(fileLocation,filesToExport[1],100);
     char* send2 = strncat(whereAmI,filesToExport[1],100);



// ***** This is where I try to send the files ***** 

CopyFile(from1,send1,TRUE);

//Fails when I add two calls to CopyFile();
CopyFile(from2,send2,TRUE);

    return 0;
}

char* getPath()
{

      char* appPath;
      char* usrPath;
      char* fullPath;
      char* drive     = getenv("SYSTEMDRIVE");
      char* user      = getenv("USERNAME");


      OSVERSIONINFO info;
      info.dwOSVersionInfoSize = sizeof(info);
      GetVersionEx(&info);

      if (info.dwMajorVersion >= 6)
      {
        appPath = "\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles";
        usrPath = "\\Users\\";
      }

      else
      {
         appPath = "\\Application Data\\Mozilla\\Firefox\\Profiles";
         usrPath = "\\Documents and Settings\\";
      }

      strncat(drive,usrPath,strlen(usrPath) + 1);
      strncat(drive,user,strlen(user) + 1);
      strncat(drive,appPath,strlen(appPath) + 1);
      fullPath = drive;



      return (fullPath);
}

char** findProfile(char* path)
{

    DIR *dir = opendir (path);
    struct dirent *dp;          
    size_t filecount = 0;       
    size_t i = 0;
    char **files;

    if (dir == NULL) {

        return NULL;           
    }
    while ((dp = readdir (dir)) != NULL) {
        filecount++;
    }

    files = (char **) malloc (filecount * sizeof (*files));
    if (files == NULL) {
        return NULL;            
    }


    rewinddir (dir);
    while ((dp = readdir (dir)) != NULL) {
        files[i] = strdup (dp->d_name);
        if (files[i] == NULL) {

            while (i > 0) {
                free (files[--i]);
            }
            free (files);
            return NULL;
        }

        i++;
    }

    closedir (dir);
    return files;
}

Ответы [ 2 ]

3 голосов
/ 02 августа 2009

в вашем коде:

char* whereAmI         = _getcwd(NULL,0);

выделяет достаточно памяти для пути

char* send2 = strncat(whereAmI,filesToExport[1],100);

Затем strncat пытается добавить этот путь, используя память, которой там нет.

Результат: неопределенное поведение.

0 голосов
/ 02 августа 2009

Я думаю, что по крайней мере часть вашей проблемы заключается в том, что from1 и from2 указывают на одну и ту же строку (как это делают send1 и send2).

Обе строки возвращают принтер к fileLocation, поэтому from1 и from2 указывают на одно и то же. Аналогично для send1 и send2.

 char* from1 = strncat(fileLocation,filesToExport[0],100);
 char* from2 = strncat(fileLocation,filesToExport[1],100);

Другая проблема заключается в том, что вы перезаписываете буферы (и / или записываете в буферы, которые вам не принадлежат).

getcwd() возвращает указатель на память, которую вы не можете изменять, в то время как _getcwd() возвращает указатель на память, выделенную malloc (так что вы можете изменить ее), она равна размеру возвращаемой строки (как насколько вы знаете), поэтому вы не можете присоединиться к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...