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

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

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

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

10.07.2011, 23:39. Просмотров 2470. Ответов 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
voral
492 / 472 / 81
Регистрация: 16.03.2008
Сообщений: 2,229
11.07.2011, 00:47 #16
Я не в плане критики - ради инфы о том к чему можно стремиться.

PS Нумеровать тем плагином тоже можно было
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,850
11.07.2011, 00:48 #17
Цитата Сообщение от kravam Посмотреть сообщение
Первый месяц бесплатно!
Если это не шутка, то потянуло бы на нарушение правил, если бы не абсурдность предложения. Очень хотелось бы посмотреть на человека, готового установить это чудо у себя в компе, да ещё и деньги за него платить. Если только случайно попадётся... Кто-нибудь из тех, кто транслитом пишет...
И кстати, на вполне резонный вопрос
Цитата Сообщение от schdub Посмотреть сообщение
А какой профит от использования твоей программы?
убедительного ответа так и не последовало.

Цитата Сообщение от kravam Посмотреть сообщение
Если у тебя в оригинальном названии нет пробела, его не будет и в имени копированного файла. Это плюс, я считаю. Лично мне хватило одного раза возиься с этими пробелами, чтобы бежать от них как от огня.
Кто на эти грабли часто наступает, без проблем себе перловый скрипт в три строчки напишет, а остальным без разницы, как там винда копии файлов обзывает. Но по сути сверлить ещё одну дыру в и без того не самой надёжной операционной системе - какой-то сомнительный тюнинг...
2
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
11.07.2011, 00:56  [ТС] #18
Ну в конце концов, можно поискать способ, который не давал бы запускать прогу из командной строки. Если вас работа проги устраивает и вы за себя не ручаетесь, что спьяну не сядете и упорно не будете запускать () мою прогу из командной строки с каким-то мифическим шелл кодом вот возьмите и поищите такой способ. Мне надо было- я нашёл и как в реестр вставлять и всё.

Добавлено через 5 минут
А чё такое профит? И я не часто наступаю на грабли, я сказал уже, одного раза мне хватило. И чё, мне щас перл изучать? Я сделал только то, что сделал, как мог. А ты и этого не сделал. А сказать "сверлить дыру" это нчего не сказать.. Впрочем, за такие высказывания здесь дают плюсы всякие прихвостни. Так что ты в почёте, будешь easybudda
Сверли дырки для орденов, ё
2
voral
492 / 472 / 81
Регистрация: 16.03.2008
Сообщений: 2,229
11.07.2011, 00:57 #19
Цитата Сообщение от kravam Посмотреть сообщение
Ну в конце концов, можно поискать способ, который не давал бы запускать прогу из командной строки.
По ряду ваших ответов видно, что вы ни когда не писали программы для людей. Ну или тем людям не повезло и у них было в голове "копьютер по другому не умеет" или "или освою или уволят"
0
alex_x_x
11.07.2011, 00:58
  #20

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
Впрочем, за такие высказывания здесь дают плюсы всякие прихвостни.
хорошо, что не ставят минусы радуйте нас чаще

0
voral
492 / 472 / 81
Регистрация: 16.03.2008
Сообщений: 2,229
11.07.2011, 01:00 #21
Цитата Сообщение от kravam Посмотреть сообщение
А сказать "сверлить дыру" это нчего не сказать.. Впрочем, за такие высказывания здесь дают плюсы всякие прихвостни. Так что ты в почёте, будешь easybudda
Сверли дырки для орденов, ё
я б на вашем месте не в штыки воспринимал, все что тут сказали. А попытался сделать разумные выводы. Т.к. по сути эта программа могла бы найти своего пользователя. Но ее надо, как минимум, довести до ума и, опять же по как минимум, снабдить различными защитами "от дурака"
1
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
11.07.2011, 01:05  [ТС] #22
Цитата Сообщение от voral Посмотреть сообщение
По ряду ваших ответов видно, что вы ни когда не писали программы для людей. Ну или тем людям не повезло и у них было в голове "копьютер по другому не умеет" или "или освою или уволят"
Я и так тебе могу сказать, что не писал, я этого и не скрываю.

Добавлено через 3 минуты
Цитата Сообщение от voral Посмотреть сообщение
я б на вашем месте не в штыки воспринимал, все что тут сказали. А попытался сделать разумные выводы. Т.к. по сути эта программа могла бы найти своего пользователя. Но ее надо, как минимум, довести до ума и, опять же по как минимум, снабдить различными защитами "от дурака"
давай по пунктам, чё надо сделать, как именно довести до ума? То есть не как, а что надо чтобы было или не было?

Добавлено через 56 секунд
Не факт, что я буду сие реализовывать, просто интересно, вот ты знаешь что говоришь, так вот я и хочу в этом убедиться.
0
voral
492 / 472 / 81
Регистрация: 16.03.2008
Сообщений: 2,229
11.07.2011, 01:17 #23
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kravam Посмотреть сообщение
Добавлено через 56 секунд Не факт, что я буду сие реализовывать, просто интересно, вот ты знаешь что говоришь, так вот я и хочу в этом убедиться
Эта фраза была лишней.
Я не клоун, чтоб развлекать. И не вижу причин доказывать тебе, что либо.

ЗЫ блин, есть еще люди, которые среди отзывов на свое детище хотят слышать исключительно восхищенные возгласы.....
3
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
11.07.2011, 01:23  [ТС] #24
А ты не развлекай. Ты скажи, чё в ней лишнего или наоборот чё надо добавить, учитывая, что она изначально предназначена для того, чтобы запускаться в проводнике. Исходник можешь не смотреть.
0
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,022
11.07.2011, 01:25 #25
Цитата Сообщение от kravam Посмотреть сообщение
Корректно работает с русским языком и пробелами.
Если б не работала, было бы совсем ужасно. Но Unicode-имена не поддерживаются, что тоже не добавляет программе плюсов.
Цитата Сообщение от kravam Посмотреть сообщение
Ну в конце концов, можно поискать способ, который не давал бы запускать прогу из командной строки.
Да этот способ уже почти найден. Забавный способ определять начало аргумента по правой кавычке и обязательность полного пути к файлу практически не оставляют шансов на созидательное использование из командной строки. Только на эксплуатацию уязвимостей
C++
1
temp= &temp[strlen(temp)];
А чё, смотрится загадочно и непонятно. Внушает, короче.
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
11.07.2011, 01:30 #26
Цитата Сообщение от grizlik78 Посмотреть сообщение
А чё, смотрится загадочно и непонятно. Внушает, короче.
ну а че, если юникод принципиально не используется, то понятно почему тут не применяется CommandLineToArgvW + GetCommandLineW
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
11.07.2011, 01:31  [ТС] #27
Вот мне тут сказали. что я типа неправильно воспринимаю критику. Вот чё я должен понять из предыдущего поста grizlik78?
Только и остаётся сказать, что сам дурак.
0
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,022
11.07.2011, 01:35 #28
Спокойнее. Здесь у меня не было критики. Мне критиковать надоело уже, реакцию я заранее знаю.

Добавлено через 1 минуту
Ну, то есть немножко критики всё-равно было — программа без поддержки юникода не нужна втройне.
1
voral
492 / 472 / 81
Регистрация: 16.03.2008
Сообщений: 2,229
11.07.2011, 01:37 #29
Цитата Сообщение от kravam Посмотреть сообщение
Вот мне тут сказали. что я типа неправильно воспринимаю критику. Вот чё я должен понять из предыдущего поста grizlik78?
Только и остаётся сказать, что сам дурак.
А кто тебе сказал, что в каждом посте теперь (после твоего поведения) будет, что то полезное для тебя?

Хотя несколько конкретных замечаний было сделано.
Да и я был настроен пообщаться, пока ты не изрыгнул детскую приписку.
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
11.07.2011, 01:40  [ТС] #30
Не, ну понять-то я чё должен?
Вот voralупорно знает какой функционал надо добавить к моей проге и какой убрать и столь же упорно молчит.
Ты вообще непонятно что написал. Короче, я понял, что всё плохо. Ну, пусть так и будет.

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

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

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

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

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


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

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

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