Поиск файлов и копирование их C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by TheThief, 9 Oct 2009.

  1. TheThief

    TheThief New Member

    Joined:
    8 Oct 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Поиск файлов и копирование их C++\Asm

    в общем я ламерюга пока что=) в C++ 2 дня
    мне надо чтобы был поиск *.txt файлов в C:\123\ и копирование этих найденных файлов в D:\123\
    кто может напишите скрипт этого буду очень благодарен))
    заранее спасибо)
    собираюсь asm изучать дак вот если у кого есть на asm то что я прошу на c++ то выкладывайте)

    ах да и еще желательно разжевать все =)
     
    #1 TheThief, 9 Oct 2009
    Last edited: 9 Oct 2009
  2. POS_troi

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

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Избався от слова СКРИПТ или учи PHP|Perl и т.д. ;)

    Code:
    SHFILEOPSTRUCT s;
    
        s.wFunc = FO_COPY;
        s.pFrom = "c:\\123\\*.txt\0";
        s.pTo = "d:\\123";
    
        SHFileOperation(&s);
    
     
  3. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а я садист и у меня кода меньше ))) :p

    system("@for %1 in (\"C:\\123\\*.txt\") do @copy \"%1\" \"D:\\123\\\">>nul");
     
    2 people like this.
  4. TheThief

    TheThief New Member

    Joined:
    8 Oct 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    а если надо искать на всех жестких дисках? эт сработает?=) мне ведь надо не просто копировать из 123\*.txt а чтобы копировались из 123\1 и 123\2 123\3 и т.д. ушел пробовать)
     
  5. TheThief

    TheThief New Member

    Joined:
    8 Oct 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    slesh, работает но то что в папке C:\123\123 не копирует) и еще там запускается черное окошко это чо cmd чтоли? бред;d батч ... >_<
     
    #5 TheThief, 9 Oct 2009
    Last edited: 9 Oct 2009
  6. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну тогда юзай апинки FindFirstFile FindNextFile и если попадается каталог то рекурсивно запускай данную функцию
     
  7. TheThief

    TheThief New Member

    Joined:
    8 Oct 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    The Thief
    поподробней насчет FindFirstFile FindNextFile
     
  8. St0nX

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

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    PHP:
    #include <windows.h>
    #include <tchar.h> 
    #include <stdio.h>
    #include <strsafe.h>

    void DisplayErrorBox(LPTSTR lpszFunction);

    int _tmain(int argcTCHAR *argv[])
    {
       
    WIN32_FIND_DATA ffd;
       
    LARGE_INTEGER filesize;
       
    TCHAR szDir[MAX_PATH];
       
    size_t length_of_arg;
       
    HANDLE hFind INVALID_HANDLE_VALUE;
       
    DWORD dwError=0;
       
       
    // If the directory is not specified as a command-line argument,
       // print usage.

       
    if(argc != 2)
       {
          
    _tprintf(TEXT("\nUsage: %s <directory name>\n"), argv[0]);
          return (-
    1);
       }

       
    // Check that the input path plus 3 is not longer than MAX_PATH.
       // Three characters are for the "\*" plus NULL appended below.

       
    StringCchLength(argv[1], MAX_PATH, &length_of_arg);

       if (
    length_of_arg > (MAX_PATH 3))
       {
          
    _tprintf(TEXT("\nDirectory path is too long.\n"));
          return (-
    1);
       }

       
    _tprintf(TEXT("\nTarget directory is %s\n\n"), argv[1]);

       
    // Prepare string for use with FindFile functions.  First, copy the
       // string to a buffer, then append '\*' to the directory name.

       
    StringCchCopy(szDirMAX_PATHargv[1]);
       
    StringCchCat(szDirMAX_PATHTEXT("\\*"));

       
    // Find the first file in the directory.

       
    hFind FindFirstFile(szDir, &ffd);

       if (
    INVALID_HANDLE_VALUE == hFind
       {
          
    DisplayErrorBox(TEXT("FindFirstFile"));
          return 
    dwError;
       } 
       
       
    // List all the files in the directory with some info about them.

       
    do
       {
          if (
    ffd.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)
          {
             
    _tprintf(TEXT("  %s   <DIR>\n"), ffd.cFileName);
          }
          else
          {
             
    filesize.LowPart ffd.nFileSizeLow;
             
    filesize.HighPart ffd.nFileSizeHigh;
             
    _tprintf(TEXT("  %s   %ld bytes\n"), ffd.cFileNamefilesize.QuadPart);
          }
       }
       while (
    FindNextFile(hFind, &ffd) != 0);
     
       
    dwError GetLastError();
       if (
    dwError != ERROR_NO_MORE_FILES
       {
          
    DisplayErrorBox(TEXT("FindFirstFile"));
       }

       
    FindClose(hFind);
       return 
    dwError;
    }


    void DisplayErrorBox(LPTSTR lpszFunction

        
    // Retrieve the system error message for the last-error code

        
    LPVOID lpMsgBuf;
        
    LPVOID lpDisplayBuf;
        
    DWORD dw GetLastError(); 

        
    FormatMessage(
            
    FORMAT_MESSAGE_ALLOCATE_BUFFER 
            
    FORMAT_MESSAGE_FROM_SYSTEM |
            
    FORMAT_MESSAGE_IGNORE_INSERTS,
            
    NULL,
            
    dw,
            
    MAKELANGID(LANG_NEUTRALSUBLANG_DEFAULT),
            (
    LPTSTR) &lpMsgBuf,
            
    0NULL );

        
    // Display the error message and clean up

        
    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT
            (
    lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
        
    StringCchPrintf((LPTSTR)lpDisplayBuf
            
    LocalSize(lpDisplayBuf) / sizeof(TCHAR),
            
    TEXT("%s failed with error %d: %s"), 
            
    lpszFunctiondwlpMsgBuf); 
        
    MessageBox(NULL, (LPCTSTR)lpDisplayBufTEXT("Error"), MB_OK); 

        
    LocalFree(lpMsgBuf);
        
    LocalFree(lpDisplayBuf);
    }

    Пример с мсдн
    1. Ищеш первый попавшийся файл\дирректорию
    hFind = FindFirstFile(szDir, &ffd);
    2. Проверяеш Что это
    ffd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY дирректория или нет
    3. Если нет то проверяеш удовлетворяет ли он условиям поиска
    4. Далее если удовлетворяет то делаеш с ним че тебе надо
    5. Далее вызываеш
    while (FindNextFile(hFind, &ffd) != 0)
    Тут так же как и выше проверяеш что это и условия поиска.
    6. Если же это дирректория то вызываеш все это дело еще раз только с имянем той дирректории которую ты нашел.

    Тут на форуме где то было. Кто то писал на С++ прогу которая тырит историю QIP там метод поиска такого какого тебе надо в подробностях.
     
    #8 St0nX, 9 Oct 2009
    Last edited: 9 Oct 2009
  9. TheThief

    TheThief New Member

    Joined:
    8 Oct 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    тут была шутка если чо;D
     
    #9 TheThief, 10 Oct 2009
    Last edited: 11 Oct 2009
  10. St0nX

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

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    в бан бы тебя
     
  11. altblitz

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

    Joined:
    5 Jun 2009
    Messages:
    3,697
    Likes Received:
    3,139
    Reputations:
    236
    slesh, хороший пример. образователен :)
    а два подвоха в коде, пусть исправит сам.