Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2013, 18:51   #1
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию Копирование каталогов

всем привет)задача такая, реализовать команду "cp" с некоторыми определенными ключами.Некоторые ключи уже сделал, остались еще парочку...и вот в чем вопрос,подскажите как можно сделать рекурсивное копирование каталога??т.е. запускаем нашу программу через командную строку в параметрах указываем что копируем каталог в каталог...как это можно организовать?вот имеющейся код:
Код:
#include <cstdlib>
#include "string.h"
#include "stdio.h"
#include "windows.h"


// функция копирования имени файла1 файлу2 
void cop(char str[],char str1[]){
    char ch[1]; 
    char temp[100];
    temp[0]=0;
    int j;
     if((int) str[1]==58){					//если файл1 содержит путь
     int i=strlen(str);
     while ((int) str[i]!=92){i--;}				//находим последний \(слэш)
        
     for (j=i+1;j<strlen(str);j++){				
     ch[0]=str[j];
     ch[1]=0;
     strcat(temp,ch);
     }
     strcat(str1,temp);
     } 
     else {strcat(str1,str);
     }
}

//Основная программа 
int main(int argc, char * argv[])
{
FILE *out_file;
bool open=false;						
char sim;
 
  if(argc==4){							//если введен ключ
   if((int) argv[3][strlen(argv[3])-1]==92){			//если в файле2 указан только путь 
              cop(argv[2],argv[3]);				//присваиваем файлу2 имя файла1
              }            
 
  out_file=fopen(argv[3],"rb");					//проверяем существует или нет файл приемик
  if(out_file==NULL){ open=false;}
  else {fclose(out_file);open=true;}
  if (strcmp("-I",argv[1])==0){
         if (open==true){
                         printf("rewrite?? \n");
                         scanf("%c",&sim);
                           if ((sim=='y')||(sim=='Y'))
                             {CopyFile(argv[2],argv[3],false);}	//копирование с подавлением запроса системы о существовании файла2
                           if ((sim=='n')||(sim=='N'))
                             {CopyFile(argv[2],argv[3],true);}	
                         }
         if (open==false){CopyFile(argv[2],argv[3],false);}
                        }
  if (strcmp("-F",argv[1])==0){
         if(open==true){
                        DeleteFile(argv[3]);
                        CopyFile(argv[2],argv[3],false);
                        }
         if (open==false)
           {
             CopyFile(argv[2],argv[3],false);
           }
}                    
  	else {printf("Not key");}
                     
  }
  if(argc==3){							//если команда введена без ключа
              if((int) argv[2][strlen(argv[2])-1]==92){          
              cop(argv[1],argv[2]);
              }   
              
              CopyFile(argv[1],argv[2],false); 			//копирование с подавлением запроса системы о существовании файла2
  }
}
-=Andriushka=- вне форума Ответить с цитированием
Старый 03.10.2013, 23:22   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

FindFirstFile/FindNextFile и рекурсируйте на здоровье
counter вне форума Ответить с цитированием
Старый 04.10.2013, 10:22   #3
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
FindFirstFile/FindNextFile и рекурсируйте на здоровье
а не мог бы маленько показать как именно оформлять?а то чтото неполучается сделать((
-=Andriushka=- вне форума Ответить с цитированием
Старый 04.10.2013, 11:59   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от -=Andriushka=- Посмотреть сообщение
а не мог бы маленько показать как именно оформлять?а то чтото неполучается сделать((
да не вопрос

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
counter вне форума Ответить с цитированием
Старый 04.10.2013, 19:36   #5
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
за подсказку спасибо)
а еще случаем незнаешь как можно получить данные о файле(типа когда создан или обновлен) чтобы можно было сравнить и при определеном условии произвести операцию?есть ли какая нибудь чудесная функция?

наткнулся в инете вот на такую штуку и попробовал добавить ее к себе:
Код:

                SHFILEOPSTRUCT fo;
                ...............
                fo.hwnd=NULL;
		fo.wFunc = FO_COPY;
		fo.pFrom = "D:\\123";//pFromFolder;
		fo.pTo = "D:\\321";//pToFolder;
		//fo.fFlags = FOF_SILENT | FOF_NOERRORUI;
        fo.fFlags = FOF_ALLOWUNDO|FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR; 
        
		int rc = SHFileOperation(&fo);
		return (rc == 0);
и при запуске через командную строку выдает ошибку что не может скопировать что не может прочесть...почему так и вообще данный метод применим для решения этой задачи,подскажите

Последний раз редактировалось Stilet; 05.10.2013 в 11:58.
-=Andriushka=- вне форума Ответить с цитированием
Старый 05.10.2013, 12:05   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По идее этот код тебе подходит.
Чему rc после выполнения равно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2013, 14:21   #7
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>


void  GetTimeFile(FILETIME* ft, SYSTEMTIME* tout) {
     SYSTEMTIME utc = {0};
     FileTimeToSystemTime(ft, &utc);
     SystemTimeToTzSpecificLocalTime(NULL, &utc, tout);
}



void  copy_files(const TCHAR* src, const TCHAR* dst) {
      TCHAR           ps[MAX_PATH];
      TCHAR           ds[MAX_PATH];
      HANDLE          fp;
      SYSTEMTIME      st;
      WIN32_FIND_DATA fi;

      _stprintf(ps, _T("%s\\*.*"), src);

     fp = FindFirstFile(ps, &fi);
     if(fp == INVALID_HANDLE_VALUE)
           return;

     if(! CreateDirectoryEx(src, dst, NULL)) {
           FindClose(fp);
           return;
     }

     do {
            _stprintf(ds, _T("%s\\%s"), dst, fi.cFileName);
            _stprintf(ps, _T("%s\\%s"), src, fi.cFileName);

            if(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                   if((fi.cFileName[0] != _T('.')) && (_tcslen(fi.cFileName) > 2))
                          copy_files(ps, ds);
            } else  {
                  // для примера копируем те файлы которые были созданы в 2012 году
                  GetTimeFile(&fi.ftCreationTime, &st);
                  if(st.wYear == 2012)
                         CopyFile(ps, ds, TRUE);
           }
      } while(FindNextFile(fp, &fi) != FALSE);

      FindClose(fp);
}



int  main(void) {
      copy_files(_T("D:\\исходная папка"), _T("C:\\новая папка"));
      return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 05.10.2013, 15:17   #8
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от Nuklon Посмотреть сообщение
Код:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>


void  GetTimeFile(FILETIME* ft, SYSTEMTIME* tout) {
     SYSTEMTIME utc = {0};
     FileTimeToSystemTime(ft, &utc);
     SystemTimeToTzSpecificLocalTime(NULL, &utc, tout);
}



void  copy_files(const TCHAR* src, const TCHAR* dst) {
      TCHAR           ps[MAX_PATH];
      TCHAR           ds[MAX_PATH];
      HANDLE          fp;
      SYSTEMTIME      st;
      WIN32_FIND_DATA fi;

      _stprintf(ps, _T("%s\\*.*"), src);

     fp = FindFirstFile(ps, &fi);
     if(fp == INVALID_HANDLE_VALUE)
           return;

     if(! CreateDirectoryEx(src, dst, NULL)) {
           FindClose(fp);
           return;
     }

     do {
            _stprintf(ds, _T("%s\\%s"), dst, fi.cFileName);
            _stprintf(ps, _T("%s\\%s"), src, fi.cFileName);

            if(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                   if((fi.cFileName[0] != _T('.')) && (_tcslen(fi.cFileName) > 2))
                          copy_files(ps, ds);
            } else  {
                  // для примера копируем те файлы которые были созданы в 2012 году
                  GetTimeFile(&fi.ftCreationTime, &st);
                  if(st.wYear == 2012)
                         CopyFile(ps, ds, TRUE);
           }
      } while(FindNextFile(fp, &fi) != FALSE);

      FindClose(fp);
}



int  main(void) {
      copy_files(_T("D:\\исходная папка"), _T("C:\\новая папка"));
      return 0;
}
очень хорошая реализация)а не подскажешь как сделать чтобы можно было с командной строки запустить в виде "екзешник исходная_папка новая_папка"?(
-=Andriushka=- вне форума Ответить с цитированием
Старый 05.10.2013, 18:49   #9
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от -=Andriushka=- Посмотреть сообщение
очень хорошая реализация)а не подскажешь как сделать чтобы можно было с командной строки запустить в виде "екзешник исходная_папка новая_папка"?(
xcopy /?
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 05.10.2013, 19:46   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Кащей
Будешь удивлен, но она не везде есть )
(Я был удивлен)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование каталогов buenosaire Помощь студентам 2 09.05.2010 12:19
Копирование файлов и каталогов перетаскиваением между двумя окнами SANTA_KLAUD Общие вопросы Delphi 3 28.05.2008 21:52
список каталогов VVVadim Общие вопросы Delphi 11 03.04.2008 13:00
Создание удаление каталогов, копирование файлов. Alar Общие вопросы Delphi 1 18.12.2007 18:30
древо каталогов Dunpeal Компоненты Delphi 6 21.11.2006 06:22