Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
#1

предлагаю программу людям "альтернативное копирование файлов в проводнике" - C++

10.07.2011, 23:39. Просмотров 2462. Ответов 44
Метки нет (Все метки)

Суть: программа копирует файл, который передаётся ей параметром командной строки. То есть: в первую очередь программу следует сделать встроенной в проводник. Делается это так: здесь скачивается программа, которая добавляет в реестр нужные вам проги. Компилим мою прогу
C++
1
g++ ra.cpp
Полученный экзешник пихаем в любую папку, полное имя которой НЕ СОДЕРЖИТ ПРОБЕЛОВ. После с помощью скачанной проги добавляем этот экзешник в меню проводника (можно и вручную поправить реестр кто умеет, там ничё сложного) и озаглавливаем пункт так: "копирование как мне надо"

//++++++++++++++++++++++++++++++++++++++++++++++

После все действия знакомы. Правой кнопкой на файл file.txt-> копирование как мне надо
В папке появляется файл file_0.txt
Повторяем действие, в папке появляется файл file_1.txt; повторяем ещё раз, имеем файл file_2.txt
...Так, а что будет, если сейчас мы скорпируем file_1.txt? Пробуем
Правой кнопкой на файл file_1.txt-> копирование как мне надо
Получаем file_3.txt! Предсказуемо!

Корректно работает с русским языком и пробелами.

................................................................

Приложение консольное, поэтому появляется окошко и тут же исчезает, это легко убрать, я могу это сделать. В листинге закомментирована вся отладочная информация, кому не нужна, уберите, кто решит поковыряться, скажите, я сам уберу- без неё прога много симпатичнеей, но она может пригодиться, вот в чём дело. Кто будет пользоваться, все ошибки сюда!! Бум исправлять!! Тестировано на XP home потому, что мне надоело копировать файлы по их варианту с "копия". Короче, на вкус и цвет, что называется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include <Windows.h> 
#include <stdio.h> 
#include <ctype.h> 
#include <iostream> 
#include <set> 
using namespace std;
 
//Эта функция выполняет начальные преобразования, а именно:
//заполняет    строку poln_ima_bez_rash_i_bez__chislo (даже если расширения нет!
//_chislo это строка вида _число, его тоже надо вычленять (если оно есть и в отдельную строку запихивать)) 
//и строку rashirenie; если расширения нет, пишет туда ноль
//И вот заполняется строка _chislo, если такого в имени файла нет, тот туда пишется ноль  
void nach_preobr (char* polnoe_ima_faila, char* poln_ima_bez_rash_i_bez__chislo, char* rashirenie, char* _chislo);
 
//Функция формирует полное имя файла, его и возвращает
char* poln_ima_fail (char* polnoe_ima_faila);
 
//Что делает эта функция, смотри в тексте проги
void f_poisk_pohozhih_failov (set<int>*, char*, int );
 
 
int main () {
    
 //Это флаг "есть ли расширение"
 //bool est_li_rashirenie;
 
 //Это вот расширение тут будет (если будет)
 char rashirenie [MAX_PATH]= {0};
 
 //Это вот строка _chislo
 char _chislo [MAX_PATH]= {0};
 
 //А вот тут полное имя файла без расширения и без _число
 char poln_ima_bez_rash_i_bez__chislo [MAX_PATH];
 
 //А вот полное имя файла пусть будет 
 char polnoe_ima_faila [MAX_PATH];
 
 //наёдём полное имя файла
 poln_ima_fail (polnoe_ima_faila);
 
 //Выполним с ним преобразования
 nach_preobr (polnoe_ima_faila, poln_ima_bez_rash_i_bez__chislo, rashirenie, _chislo);
// printf ("polnoe_ima_faila= %s   \n", polnoe_ima_faila);
// printf ("poln_ima_bez_rash_i_bez__chislo= %s   \n", poln_ima_bez_rash_i_bez__chislo);
// printf ("rashirenie= %s   \n", rashirenie);
// printf ("_chislo= %s   \n", _chislo);
 
 //ОТлично, теперь нам нужна строка: poln_ima_bez_rash_i_bez__chislo+звёздочка+расширение
 //(если есть), всю эту херь мы запхаем в функцию f_poisk_pohozhih_failov
 //Эта функция будет искать файлы, у которые соответсвуют переданной строке, ну то есть у которых 
 //грубо говоря, совпадают начало и конец
 //А потом эта функция будет смотреть, а что стоит между началом и концом
 //А стоять там должна строка вида _число, и вот если она стоит, то из таких чисел формируется вектор
 //<int>, который также передастся фв эту функцию
 //Вот цель этой функции
 //Так, а величины "длина poln_ima_bez_rash_i_bez__chislo" они нужны нам внутри этой функции,
 //чтобы их не вычислять внутри её, просто параметром передадим и всё 
 char shablon [MAX_PATH];
 char temp [MAX_PATH];
 strcpy (temp, poln_ima_bez_rash_i_bez__chislo);
 strcpy (shablon,  (strcat   (strcat (temp, "*"), rashirenie)));
// printf ("shablon= %s   \n", shablon);
// printf ("poln_ima_bez_rash_i_bez__chislo= %s   \n", poln_ima_bez_rash_i_bez__chislo);
 set<int> se;
 f_poisk_pohozhih_failov (&se,  shablon, strlen (poln_ima_bez_rash_i_bez__chislo)); 
 
 
 //ОТлично, теперь сформируем новое число в зависимост от того, пустой или нет se
 int novoe_chhislo;
 if (!se.size()) 
  novoe_chhislo= 0;
 else {
  set<int>::iterator it;
  it= se.end();
  it--;
  novoe_chhislo= *it+ 1; 
 }
 //сформировали новое число
 
 //printf ("novoe_chhislo= %d\n", novoe_chhislo);
 
 //Осталось скропать новое имя 
 char novoe_ima [MAX_PATH];
 char buffer [MAX_PATH];
 strcat(strcat(strcat(strcpy (novoe_ima, poln_ima_bez_rash_i_bez__chislo),"_"),itoa(novoe_chhislo, buffer, 10)), \
  rashirenie);
 //скропали новое имя
 
 
 //printf ("novoe_ima= %s\n", novoe_ima);
 
 //Теперь так: (последний аргумент не важен)
 CopyFile (polnoe_ima_faila, novoe_ima, true);           
}
 
//Ф У Н К Ц И И 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
char* poln_ima_fail (char* polnoe_ima_faila) {
 char* temp= GetCommandLine();
// printf ("=== %s\n", temp);
 temp= &temp[strlen(temp)];
 do {
  temp--;
 }
 while (*temp!= '"');
 temp+=2;
 strcpy (polnoe_ima_faila, temp);
 return polnoe_ima_faila;
};
 
//+++++++++++++++++++++++++++++++++
void nach_preobr (char* polnoe_ima_faila, char* poln_ima_bez_rash_i_bez__chislo, char* rashirenie, char* _chislo) {
 strcpy (poln_ima_bez_rash_i_bez__chislo, polnoe_ima_faila);
 char* temp= &polnoe_ima_faila[strlen(polnoe_ima_faila)];
 do {
  temp--;
 }
 while (*temp!='\\'&& *temp!= '.');
 
 if (*temp=='.') {
  strcpy (rashirenie, temp); 
  strcpy (poln_ima_bez_rash_i_bez__chislo, polnoe_ima_faila);
  poln_ima_bez_rash_i_bez__chislo [strlen(poln_ima_bez_rash_i_bez__chislo)- strlen(rashirenie)]= 0;
 }
 
 //Щас займёмся _chislo
 temp= &poln_ima_bez_rash_i_bez__chislo [strlen(poln_ima_bez_rash_i_bez__chislo)];
 do {
  temp--;
 }
 while (*temp!='\\'&& *temp!= '_');
// printf ("d d d d d d d d  %s   %d\n",  temp, temp [4]);
 if (*temp=='_') {
//  printf ("ddddddddddddddd  %s\n",  temp);
  char* temp_0= temp+ 1;
  for (;isdigit(*temp_0);temp_0++);
//  printf ("dddddfffffff  %d\n",  temp_0[0]);
  if (!*temp_0) {
//   printf ("yyyyyyyyyyyyyyddddddddddddddd  %s\n",  temp);
   strcpy (_chislo, temp+ 1);
   *temp= 0;
  }
 }
 
}
//+++++++++++++++++++++++++++++++++
void f_poisk_pohozhih_failov (set<int>* se,  char* shablon, int dlina_poln_ima_bez_rash_i_bez__chislo) {
//                        printf("%d \n\n\n\n", dlina_poln_ima_bez_rash_i_bez__chislo);
        
        //Ищем имя директории; не ищем, вернее, а устанавливаем
        char ima_dir [MAX_PATH];         
        strcpy (ima_dir, shablon);
        char* p= &ima_dir[strlen(ima_dir)];
        while (*--p!= '\\');
         *++p= 0;
        //Теперь ima_dir указывает на имя директории
 
        WIN32_FIND_DATA FindFileData;
        HANDLE hf;
        hf = FindFirstFile(shablon,&FindFileData);
        if(hf != INVALID_HANDLE_VALUE){
                do{
//                        printf("%s\n",FindFileData.cFileName);
                        strcat (ima_dir, FindFileData.cFileName);
                        //Теперь в ima_dir то, что нам и нужно; конец (расширение или отсутвие такового
                        //соответствуют шаблону), начало соответствет имени файла.
                        //Посмотрим, что в середине!   
//                        printf("%s\n", ima_dir);
                        char* temp= &ima_dir [dlina_poln_ima_bez_rash_i_bez__chislo+ 1];
//                        printf ("888 %s\n", temp);
                        
                        if (isdigit(*temp)) {
                          do {
                          temp++;
                         }
                         while (isdigit(*temp));
//                         printf ("333333 %c\n", *temp);
                         if (*temp== '.'|| *temp== 0) {
                          *temp= 0;
//                           printf ("=++ %s\n", &ima_dir [dlina_poln_ima_bez_rash_i_bez__chislo+ 1]);
                          (*se).insert(atoi(&ima_dir [dlina_poln_ima_bez_rash_i_bez__chislo+ 1]));
                         }
                        } 
                         
                        *p= 0;
 
              
                 
                }
                while(FindNextFile(hf,&FindFileData) != 0);
                FindClose(hf);
        }
 
}; 
//К О Н Е Ц   Ф У Н К Ц И Й
Первый месяц бесплатно!!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2011, 23:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос предлагаю программу людям "альтернативное копирование файлов в проводнике" (C++):

предлагаю людям класс "каждому потоку- своё окно" для тестирования многопоточных приложений. - C++
Друзья! То есть если вы разрабатывает многопоточные приложения и закалебались смотреть, что тот или иной поток выводит, то этот класс для...

предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику - C++
Друзья! Ввиду возникшей необходимости мной был написан класс &quot;рекурсивный обход матрицы&quot;; Теперь задачи на такую тематику будут решаться...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Написать программу которaя запрашиваeт у пользователя номер дня недели, затем выводит одно из сообщений "рабочий день", "суббота", "воскресенье" - C++
Добрый день необходимо написать несколько программ, кто может помогите. одна тема - одна задача!

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" - C++
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: &quot;Рабочий день&quot;,&quot;Суббота&quot; или...

Составить программу,которая выведет "Да","Нет","на границе" - C++
Вот фотки графика и задание,заранее спасибо

44
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
11.07.2011, 01:41 #31
Не, ну если настаиваешь, то переведу.
1. юникод нужен. но это я уже сказал.
2. командную строку не надо отрывать, наоборот, её надо развивать.
3. велосипеды не нужны.
4. ну понравилась мне конструкция, не смог смолчать. прости
1
t1m0n
11.07.2011, 01:44
  #32

Не по теме:

не нужная прога, альтернатива проводнику тотал или аналоги...

0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
11.07.2011, 01:44 #33
Цитата Сообщение от kravam Посмотреть сообщение
grizlik78,слушай, хорошо, а вот объясни мне один вопрос. Почему я обалденно обхожусь без юникода, а другие не могут? В данном конкретном вопросе. То есть не вообще почему, а почему вот при копировании файлов я обхожусь без юникода и нормально обхожусь?
Потому, что ты не используешь юникод в именах файлов. А вот экстраполировать свои привычки на других не стоит. Немало людей использует. Даже совсем не специально. Уж определись, программа для людей или нет? Уж сколько создателей FAR'а кусали этим юникодом, пока он там не появился. Думаешь от нечего делать?
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
11.07.2011, 01:45  [ТС] #34
Цитата Сообщение от grizlik78 Посмотреть сообщение
Не, ну если настаиваешь, то переведу.
1. юникод нужен. но это я уже сказал.
2. командную строку не надо отрывать, наоборот, её надо развивать.
3. велосипеды не нужны.
4. ну понравилась мне конструкция, не смог смолчать. прости
ОК, я понял, юникод нужен потому, что он нужен всегда, базара нет
А куда отрывать командную строку?
Какая конструкция тебе понравилась?

Не трольничай а отвечай чтобы я не переспрашивал.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
11.07.2011, 01:48 #35
Цитата Сообщение от kravam Посмотреть сообщение
А куда отрывать командную строку?
Я сказал отрывать? Я сказал не надо отрывать. Это ты её отрывать собрался. Чтобы программу нельзя было использовать из командной строки.

Цитата Сообщение от kravam Посмотреть сообщение
Какая конструкция тебе понравилась?
В моём сообщении была только одна конструкция, она выделена тегами кода C++.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
11.07.2011, 01:48 #36
Цитата Сообщение от kravam Посмотреть сообщение
grizlik78,слушай, хорошо, а вот объясни мне один вопрос. Почему я обалденно обхожусь без юникода, а другие не могут? В данном конкретном вопросе. То есть не вообще почему, а почему вот при копировании файлов я обхожусь без юникода и нормально обхождусь?
потому что ты пишешь детские программки, которым не требуется поддержки 30ти языков
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
11.07.2011, 01:49  [ТС] #37
Цитата Сообщение от grizlik78 Посмотреть сообщение
Немало людей использует. Даже совсем не специально. Уж определись, программа для людей или нет? Уж сколько создателей FAR'а кусали этим юникодом, пока он там не появился. Думаешь от нечего делать?
Опять я мало чё понял. Создателей FARA кусали юникодом? Ну так ты дай попить тогда, а то так есть охота, что переночевать негде.
0
NightmareZ
1360 / 568 / 37
Регистрация: 31.03.2009
Сообщений: 1,939
11.07.2011, 01:50 #38
Цитата Сообщение от kravam Посмотреть сообщение
А ты не развлекай. Ты скажи, чё в ней лишнего или наоборот чё надо добавить, учитывая, что она изначально предназначена для того, чтобы запускаться в проводнике. Исходник можешь не смотреть.
Ты вообще в своём уме? Что лишнего? Да твоя программа - унылый кусок верблюжьего кала. Я чуть не разрыдался, глядя на твой код. В нём плохо всё: начиная убогим, нарушающим все разумные правила хорошего стиля, кодом и заканчивая багами, которые ты не хочешь исправлять. Если бы ты сказал, что это домашняя работа, заданная в университете - я бы сказал, что это отстой, но с опытом пройдёт. Но ты считаешь, что это кто-то захочет купить, - потому я скажу, что ты болен на голову.
2
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
11.07.2011, 02:01  [ТС] #39
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я сказал не надо отрывать.
А ну да, не отрывать а развивать? Как это?

Добавлено через 3 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
потому что ты пишешь детские программки, которым не требуется поддержки 30ти языков
Речь-то идёт об именах файлов. Я их просто именую всяко и думать не думаю ни о каком юникоде. Даже если бы я писал программы (не писал) я бы всё равно при переименовании о нём не думал. Нет, ну если вам так охота, имейте его ввиду...

Добавлено через 39 секунд
Цитата Сообщение от NightmareZ Посмотреть сообщение
Ты вообще в своём уме? Что лишнего? Да твоя программа - унылый кусок верблюжьего кала. Я чуть не разрыдался, глядя на твой код. В нём плохо всё: начиная убогим, нарушающим все разумные правила хорошего стиля, кодом и заканчивая багами, которые ты не хочешь исправлять. Если бы ты сказал, что это домашняя работа, заданная в университете - я бы сказал, что это отстой, но с опытом пройдёт. Но ты считаешь, что это кто-то захочет купить, - потому я скажу, что ты болен на голову.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
11.07.2011, 02:03 #40
Цитата Сообщение от kravam Посмотреть сообщение
А ну да, не отрывать а развивать? Как это?
Кто бы ещё про трольничание говорил...
А так, чтобы программой можно было воспользоваться не только из проводника, но и непосредственно из командной строки, задавая параметры в удобной и почти свободной форме.

Цитата Сообщение от NightmareZ Посмотреть сообщение
Но ты считаешь, что это кто-то захочет купить
Да ладно, это ж явно шутка была. Хотя бегает тут клиент за 35 рублей. Может купит?
0
NightmareZ
1360 / 568 / 37
Регистрация: 31.03.2009
Сообщений: 1,939
11.07.2011, 02:05 #41
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да ладно, это ж явно шутка была.
У меня неделя странная выдалась. Несколько вот таких шуток было, а потом оказалось, что люди вовсе не шутили, а и правда не в себе. Потому я и тут не удивлюсь, если автор это серьёзно
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
11.07.2011, 02:06  [ТС] #42
grizlik78, я не хочу чтобы моей программой пользовались из командной строки, она не для этого предназначена. Как тебе ещё сказать, чтобы ты понял?

Или это как расценивать? Типа пожелания или чего? Ну так не повторяй больше, я понял всё. Ты недоволен, но по-другому не будет. До свидания.
0
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,150
11.07.2011, 02:16 #43
Цитата Сообщение от kravam Посмотреть сообщение
grizlik78, я не хочу чтобы моей программой пользовались из командной строки, она не для этого предназначена.
Чессово интересно: а какой смысл этого ограничения? Может имело смысл тогда просто модуль к проводнику написать, а не консольное приложение?
1
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.07.2011, 02:21 #44
voral, он же написал
Цитата Сообщение от kravam Посмотреть сообщение
... программу следует сделать встроенной в проводник. Делается это так: здесь скачивается программа, которая добавляет в реестр нужные вам проги.

Полученный экзешник пихаем в любую папку, полное имя которой НЕ СОДЕРЖИТ ПРОБЕЛОВ. После с помощью скачанной проги добавляем этот экзешник в меню проводника (можно и вручную поправить реестр кто умеет, там ничё сложного) и озаглавливаем пункт так: "копирование как мне надо"
пс: классно тут у вас.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
11.07.2011, 02:40  [ТС] #45
Может и модуль, но я не умею.

Никакого особого смысла. Просто меня не устраивает как копирует и именует копированные файлы винда (в эту же папку), а делаю я это преимущественно проводником. Решил написать ему альтернативу (не ему, а возможности, которая в нём есть). Всё! А людям хоца через командную строку.

Ну так попробуйте, может и получится, я не тестил. Ибо без надобности!

Добавлено через 2 минуты
voral, не, ну так-то нормально. Среди всего этого- не побоюсь этого слова- болота, которым по сути является этот раздел, найти мою тему и посоветовать написать модуль к проводнику...

Добавлено через 15 минут
DLL что ли накропать? С меня ведь станет, я накропаю. А всё равно будет плохо, на вас не угодишь.
0
11.07.2011, 02:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2011, 02:40
Привет! Вот еще темы с ответами:

Дана точка на плоскости с координатами (х, у). Составить программу, которая выдает одно из сообщений "Да", "Нет", "На - C++

Предлагаю людям как усовершенствовать IDE Dev-Cpp 4.9.9.2 - C++
Значит, напомню, среда это давно не развивается уже. Если вы скачаете её, то в предлагаемых пакетах к этой среде последний g++ версии аж...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Предлагаю людям класс для написания специфических снимков системы - C++
Задачи, преследуемые этим классом минимальные, но тем не менее. Делать снимки системы привязываясь к одному какому-нибудь процессу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru