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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 17:46   #1
Constructor1990
 
Регистрация: 06.02.2014
Сообщений: 4
Восклицание Поиск файлов, дублирующих друг друга (C# или C++)

Стоит такая задача.
Есть файлы которые дублируют друг друга, однако находящиеся в разных каталогах. Следует, Используя API Win 32, найти файлы с одинаковыми именами, далее сравнить их содержимое и дать возможность удаления файлов дубликатов, ну и все это оформить в виде оконного приложения.

Сам в С++ разбираюсь плохо, а в С# немногим лучше, но попробовал разобраться. И вот некоторые результаты поисков и разбора чужого кода.

на С++
Создание массива с именами файлов в указанном каталоге.
Код:
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
 
 
int main(int argc, char **argv)
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;
 
  setlocale(LC_ALL, "russian");
  char path[MAX_PATH] = {0};
 
  if(argv[1] == NULL)  {
      std::cout << "Enter path: ";
      scanf("%s", path);
  }
  else  {
      strcpy(path, argv[1]);
      
      for(int i=MAX_PATH-1; i>0; i--)
      {
          if(path[i]=='\\')
              break;
          path[i]=NULL;
      }
  }
  strcat(path, "\\*.*");
  printf ("Target file is %s\n", path);
 
  
  hFind = FindFirstFile(path, &FindFileData);
 
  if(hFind != INVALID_HANDLE_VALUE)  {
      do  {
          printf ("The next file found is %s\n", FindFileData.cFileName);
      }while(FindNextFile(hFind,&FindFileData));
  }
  FindClose(hFind);
  getch();
  return 0;
 }
В цикле проверяется заданный каталог, каждый элемент проверяется на предмет наличия в атрибутах какого-то бита _A_SUBDIR и если вроде он есть то проходим дальше рекурсивно в этот подкаталог.
Код:
 #include "stdafx.h"
#include <io.h>
 
 
void listdir(char *root) {
_finddata_t fd;
int rc;
long hFile;
char mask[260];
char subdir[260];
 
sprintf(mask, "%s\\*.*", root);
 
for( rc = (hFile = _findfirst(mask, &fd)); rc != -1; rc = _findnext(hFile, &fd) ) {
    if ( fd.name[0] != '.' ) {
        printf("\n%s\\%s", root, fd.name);
        if ( fd.attrib & _A_SUBDIR ) {
            sprintf(subdir, "%s\\%s", root, fd.name);
            listdir(subdir);
        }
    }
}
 
}
 
int main() {
char root[260] = "C:\\temp";
listdir(root);
 
return 0;
 
}
обход дерева подкаталогов
Код:
#include <iostream>
#include <string>
#include <windows.h>
 
void func_(const std::string &dir, const std::string &r){
     static std::string _dir;
    _dir = dir + r;
 
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = FindFirstFile(_dir.c_str(), &FindFileData);
 
    FindNextFile(hFind, &FindFileData); // 
 
    while(FindNextFile(hFind, &FindFileData))
    {
        if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
            _dir = dir + FindFileData.cFileName + "\\";
            std::cout << "Folder: " << _dir << std::endl;
            func_(_dir.c_str(), r);
        } else 
            std::cout << "File: " << FindFileData.cFileName << std::endl;
    }
 
    FindClose(hFind);
}
 
int main(){
 
    func_("C:\\", "*.*");
    return 0;
}
и похожая тема на C# http://www.programmersforum.ru/showthread.php?t=26456
Constructor1990 вне форума Ответить с цитированием
Старый 07.02.2014, 15:46   #2
Constructor1990
 
Регистрация: 06.02.2014
Сообщений: 4
По умолчанию

Ап теме!
Буду благодарен любой помощи
Constructor1990 вне форума Ответить с цитированием
Старый 07.02.2014, 20:08   #3
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Поиск одинаковых файлов - это я делал на java. Программа сканирует директорию с подкаталогами , а может и 2 каталога, потом делает сравнения по размеру файлов, с возможность побайтового сравнения.
Исходник есть.
Gui надо бы доделать, да нету времени.
На питоне бы немножно проще было бы сделать это...

А зачем вам это надо?
nikolay1982 вне форума Ответить с цитированием
Старый 11.02.2014, 18:02   #4
Constructor1990
 
Регистрация: 06.02.2014
Сообщений: 4
По умолчанию

Давайте на java. буду разбираться.
ну GUI не главное
Зачем? Задание такое.
Constructor1990 вне форума Ответить с цитированием
Старый 14.02.2014, 19:42   #5
Constructor1990
 
Регистрация: 06.02.2014
Сообщений: 4
По умолчанию

ап теме. очень актуально
Constructor1990 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависимость листбоксов друг от друга Seishi Microsoft Office Excel 1 29.05.2011 23:13
Удалить из файла абзац с номером К(абзацы отделяются друг от друга одной или несколькими пустыми строками Ragnaradi Помощь студентам 21 01.05.2011 12:02
2 bpl ссылающиеся друг на друга. eldalex Общие вопросы Delphi 2 01.11.2010 08:21
Ссылка в ячейках друг на друга ded- Microsoft Office Excel 3 10.04.2009 15:42