Функция copyfile c++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Nickotin, 19 Dec 2010.

  1. Nickotin

    Nickotin Elder - Старейшина

    Joined:
    15 Feb 2007
    Messages:
    84
    Likes Received:
    20
    Reputations:
    5
    Пытаюсь разобраться с функцией copyfile язык с++.

    Пока пример банальный, программа компилируется, но файл 2 не создается.

    Code:
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    
    using namespace std;
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CopyFile(L"C:\\1.txt",L"C:\\2.txt",true);
    		cout<<"all done\n";
    	return 0;
    	
    }
    
    
     
     
  2. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Лично у меня код компилируется и работает отлично.
    Code:
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    
    using namespace std;
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int r = CopyFile(L"C:\\1.txt", L"C:\\2.txt", true);	
    	
    	cout << (r ? "success" : "fail");
    
    	return 0;
    }
    Смотри что выведет. Если fail - значит файл уже существует. Возможно, он скрытый, и ты его не видишь?
     
    1 person likes this.
  3. Nickotin

    Nickotin Elder - Старейшина

    Joined:
    15 Feb 2007
    Messages:
    84
    Likes Received:
    20
    Reputations:
    5
    Спасибо на этом этапе разобрался.
    Еще такой вопрос:
    Я тяну файл по следующему адресу
    C:\\Users\\Имя_юзера\\AppData\\Roaming

    Так как для разных пользователей Имя_юзера будет разным, каким образом должен выглядеть адресс в коде программы?
     
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Используй функцию GetUserName.
     
  5. Nickotin

    Nickotin Elder - Старейшина

    Joined:
    15 Feb 2007
    Messages:
    84
    Likes Received:
    20
    Reputations:
    5
    Code:
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    #define UNLEN 256
    
    using namespace std;
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char buffer[UNLEN+1];
    	DWORD size; // размер
    	size = sizeof(buffer); // размер буфера
    	GetUserNameW(buffer,&size);
    	cout << buffer;
    	int r = CopyFile(L"C:\\Users\\%buffer%\\AppData\\Roaming\\1.txt", L"D:\\Sneaked.txt", true);	
    	
    	cout << (r ? "success" : "fail");
    
    	return 0;
    }
    
    Поискал примеры.
    Не разберусь с кодировками,
    cout << buffer; выводит не имя пользователя.
    Скорее я где-то допускаю ошибку, подскажите где?
    %buffer% да, и это я поставил наугад, правильно?
    Спасибо.
     
    #5 Nickotin, 19 Dec 2010
    Last edited: 19 Dec 2010
  6. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    можно работать со special folders. в данном случае это CSIDL_APPDATA. юзай SHGetSpecialFolderPath().
     
  7. ~Shapaev~

    ~Shapaev~ Member

    Joined:
    24 Oct 2009
    Messages:
    29
    Likes Received:
    7
    Reputations:
    0
    getenv еще можно заюзать.


    Code:
    void WinMain()
    
    {
    
    	char *APPDATA;
    
    	APPDATA = getenv("APPDATA");
    	MessageBox(0,APPDATA,";)",MB_OK);
    	ExitProcess(0);
    	
    }
    
     
    #7 ~Shapaev~, 19 Dec 2010
    Last edited: 19 Dec 2010
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    C: - никогда так не делайте. Потому что винда может стаять и на других диска. Лично у меня это Диск E:
    Как сказал BrainDeaD лучше получать через спец функции.

    Также есть и более альтернативный метод (на чистом апи):
    GetEnvironmentVariableA("APPDATA", buf, bufsize);

    Но он чуть не надежен. потому что можно программно подменить это через переменные окружения
     
  9. Nickotin

    Nickotin Elder - Старейшина

    Joined:
    15 Feb 2007
    Messages:
    84
    Likes Received:
    20
    Reputations:
    5
    Спасибо, за советы. Я , честно говоря, не имею пока представления как с ними работать.
    Пусть пока останется диск С, на дальнейших этапах можно будет заняться и этим.
    Но сейчас нужно определить имя пользователя и прописать в адрес.
    Каким лучше способом это сделать?
     
  10. Nickotin

    Nickotin Elder - Старейшина

    Joined:
    15 Feb 2007
    Messages:
    84
    Likes Received:
    20
    Reputations:
    5
    Прописал следующее:
    Code:
       char buff[100];
        DWORD dw=100;
        GetUserName(buff, &dw);
    
    получаю ошибку:
    error C2664: 'GetUserNameW' : cannot convert parameter 1 from 'char [100]' to 'LPWSTR'
    1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
     
  11. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 Nickotin да за тебя проще программу написать...

    1. Прочитай про ANSI и UNICODE, узнай что означает A/W в конце функций
    2. Как говорил slesh для формирования адреса файла проще заюзать ExpandEnvironmentStrings(_TEXT("%appdata%\\file.txt"),buf,sizeof(buf));
    3. RTFMSDN (c) мну
     
    _________________________
  12. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    GetUserName((LPWSTR)buff, &dw);
    А лучше Project->project_name properties->Configuration properties->General->Character Set поставить Not Set
     
    1 person likes this.