|
Нужна программа для автоподбора файлов. | ☑ | ||
---|---|---|---|---|
0
Ткачев
16.07.11
✎
13:53
|
Подскажите программу для автоподбора файлов по размеру.
т.е. Есть папка на диске, в ней лежат куча файлов, мне надо подобрать из них файлы для записи на DVD диск по максимуму размера. |
|||
1
Злопчинский
16.07.11
✎
13:55
|
задача о рюкзаке
|
|||
2
Нуф-Нуф
16.07.11
✎
13:55
|
конфига какая? релиз?
|
|||
3
Ткачев
16.07.11
✎
13:57
|
Блин, я раздел все время забываю выставлять, не важно в чем написана эта программа.
|
|||
4
almar
16.07.11
✎
13:58
|
(0) Winrar ?
|
|||
5
Ткачев
16.07.11
✎
13:59
|
Если уже в 1с то я сделал что она считает размеры файлов и папок, а дальше что то не могу сообразить как мне подобрать файлы что бы размер не превышал 4,7 Гб.
СписокФайлов = НайтиФайлы(Каталог, "*.*"); ТаблицаФайлов = Новый ТаблицаЗначений; ТаблицаФайлов.Колонки.Добавить("Имя"); ТаблицаФайлов.Колонки.Добавить("Размер"); Для Каждого ПутьФайла Из Списокфайлов Цикл Размер = 0; Файло = Новый Файл(ПутьФайла.ПолноеИмя); НоваяСтрока = ТаблицаФайлов.Добавить(); Если Файло.ЭтоКаталог() Тогда ФайлыВКаталоге = НайтиФайлы(Файло.ПолноеИмя, "*.*", Истина); Для Каждого ПутьФайлаКаталога Из ФайлыВКаталоге Цикл Файло = Новый Файл(ПутьФайлаКаталога.ПолноеИмя); Если Не Файло.ЭтоКаталог() Тогда Размер = Размер + Файло.Размер(); КонецЕсли; КонецЦикла; Иначе Размер = Файло.Размер(); КонецЕсли; НоваяСтрока.Имя = ПутьФайла.Имя; НоваяСтрока.Размер = Размер; КонецЦикла; ТаблицаФайлов.Сортировать("Размер Убыв"); |
|||
6
Ткачев
16.07.11
✎
14:00
|
(4)Нее, мне надо набор целых файлов, что бы они максимально влезли на DVD диск.
|
|||
7
Ткачев
16.07.11
✎
14:37
|
Если выражаясь языком 1с, есть комплект "Подарок" он состоит из набора товаров, вот как подобрать туда автоматически комплектующие, что бы их сумма была максимально приближенной к цене подарка и не превышала ее.
Товары находятся в таблице значений с колонками "Товар" и "Цена". |
|||
8
Конфигуратор1с
16.07.11
✎
14:50
|
(7) добавить в тз колонки количество и сумма, а потом отсортировать по сумме и в цикле пока сумма<нужнойсуммы подбирать
|
|||
9
Злопчинский
16.07.11
✎
14:58
|
плин.. может сделать онлайн сервис для таких....?
|
|||
10
Ткачев
16.07.11
✎
15:42
|
(8)Можно пример на основе ТаблицаФайлов в(5)?
|
|||
11
Злопчинский
16.07.11
✎
15:56
|
(7) дополнительные ограничения есть? что лучше: 50+10+10+10+10+10 или 80+20?
|
|||
12
Ткачев
16.07.11
✎
19:56
|
Если сумма одинаковая, то лучше больше файлов, т.е. > 50+10+10+10+10+10
|
|||
13
Dem1urg
16.07.11
✎
20:12
|
||||
14
Ткачев
16.07.11
✎
20:49
|
(13)А в 1с бейсик это можно перевести ?
|
|||
15
Ник второй
16.07.11
✎
20:52
|
можно.
|
|||
16
Dem1urg
16.07.11
✎
20:59
|
(14) Разрешаю.
|
|||
17
Ткачев
16.07.11
✎
21:09
|
(15)(16)Ну так помогите, я в этих закорючках используемых в С не понимаю, у меня сейчас все выглядит так:
Процедура КнопкаВыполнитьНажатие(Кнопка) ОчиститьСообщения(); Каталог = "C:\Архив"; Длина = 4706009088; МинимальнаяДлина = 4600000000; ВременнаяДлина = 0; СписокФайлов = НайтиФайлы(Каталог, "*.*"); ТаблицаФайлов = Новый ТаблицаЗначений; ТаблицаФайлов.Колонки.Добавить("Имя"); ТаблицаФайлов.Колонки.Добавить("Размер"); Для Каждого ПутьФайла Из Списокфайлов Цикл Размер = 0; Файло = Новый Файл(ПутьФайла.ПолноеИмя); НоваяСтрока = ТаблицаФайлов.Добавить(); Если Файло.ЭтоКаталог() Тогда ФайлыВКаталоге = НайтиФайлы(Файло.ПолноеИмя, "*.*", Истина); Для Каждого ПутьФайлаКаталога Из ФайлыВКаталоге Цикл Файло = Новый Файл(ПутьФайлаКаталога.ПолноеИмя); Если Не Файло.ЭтоКаталог() Тогда Размер = Размер + Файло.Размер(); КонецЕсли; КонецЦикла; Иначе Размер = Файло.Размер(); КонецЕсли; НоваяСтрока.Имя = ПутьФайла.Имя; НоваяСтрока.Размер = Размер; КонецЦикла; ТаблицаФайлов.Сортировать("Размер Убыв"); Для Аа = 0 по ТаблицаФайлов.Количество() - 1 Цикл ПервыйФайл = ТаблицаФайлов.Получить(Аа); РазмерФайла = ПервыйФайл.Размер + ВременнаяДлина; Если РазмерФайла <= Длина Тогда ИтоговойРазмер = РазмерФайла; Сообщить(ПервыйФайл.Имя + " " + РазмерФайла); Для Аб = Аа + 1 по ТаблицаФайлов.Количество() - 1 Цикл Если Аа = Аб Тогда Продолжить; КонецЕсли; ДалееФайл = ТаблицаФайлов.Получить(Аб); ДалееРазмер = ДалееФайл.Размер; Если ИтоговойРазмер + ДалееРазмер <= Длина Тогда Сообщить(ДалееФайл.Имя + " " + ДалееРазмер); ИтоговойРазмер = ИтоговойРазмер + ДалееРазмер; КонецЕсли; КонецЦикла; Если ИтоговойРазмер > МинимальнаяДлина Тогда Сообщить("_______________ " + ИтоговойРазмер + " _______________"); Иначе Сообщить(ИтоговойРазмер); КонецЕсли; Сообщить(" "); КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
18
Dem1urg
16.07.11
✎
22:20
|
Сделать за тебя работу? Ну-ну
Если не понятно что-то конкретное, ты не стесняйся, спроси, а предлагать другим сделать за тебя твою работу за просто так... |
|||
19
Ткачев
17.07.11
✎
08:34
|
(18)Так Вы сделайте, в базе знаний я не нашел (13), может вашу обработку туда поместят и рейтинг Ваш поднимется, у меня уж больно много временных таблиц получается и как сократить не знаю.
КолВо = ТаблицаФайлов.Количество() - 1; ВремТаб = Новый ТаблицаЗначений; ВремТаб.Колонки.Добавить("Имя"); ВремТаб.Колонки.Добавить("Размер"); Для Аа = 0 по КолВо Цикл ПервыйФайл = ТаблицаФайлов.Получить(Аа); РазмерФайла = ПервыйФайл.Размер + ВременнаяДлина; Если РазмерФайла <= Длина Тогда Для Ав = Аа + 1 По КолВо Цикл ИтоговойРазмер = РазмерФайла; НоваяСтрока = ВремТаб.Добавить(); НоваяСтрока.Имя = ПервыйФайл.Имя; НоваяСтрока.Размер = РазмерФайла; Для Аб = Ав по КолВо Цикл ДалееФайл = ТаблицаФайлов.Получить(Аб); ДалееРазмер = ДалееФайл.Размер; Если ИтоговойРазмер + ДалееРазмер <= Длина Тогда НоваяСтрока = ВремТаб.Добавить(); НоваяСтрока.Имя = ДалееФайл.Имя; НоваяСтрока.Размер = ДалееРазмер; ИтоговойРазмер = ИтоговойРазмер + ДалееРазмер; КонецЕсли; КонецЦикла; Если ИтоговойРазмер > МинимальнаяДлина Тогда Для Ин = 0 по ВремТаб.Количество() - 1 Цикл Стр = ВремТаб.Получить(Ин); Сообщить(Стр.Имя + " " + Стр.Размер); КонецЦикла; Сообщить(ИтоговойРазмер); Сообщить(" "); КонецЕсли; ВремТаб.Очистить(); КонецЦикла; КонецЕсли; КонецЦикла; |
|||
20
Ткачев
17.07.11
✎
08:39
|
А что бы не мучатся, вот: http://zalil.ru/31431012
|
|||
21
Ткачев
19.07.11
✎
08:09
|
Подниму ка я тему, может кто то что то добавит.
|
|||
22
Ткачев
20.07.11
✎
14:43
|
Все считает, все без дублей:
(5)+ Кон = 1; Для Аа = 1 по ТаблицаФайлов.Количество() Цикл Кон = Кон * 2; КонецЦикла; Для Аа = 1 По Кон - 1 Цикл Результат = 0; ИсхЧисло = Аа; Аб = 0; Пока ИсхЧисло <> 0 Цикл Если ИсхЧисло%2 Тогда СтрТаб = ТаблицаФайлов.Получить(Аб); НовСтр = ВремТаблица.Добавить(); НовСтр.Имя = СтрТаб.Имя; НовСтр.Размер = СтрТаб.Размер; Результат = Результат + СтрТаб.Размер; КонецЕсли; ИсхЧисло = Цел(ИсхЧисло / 2); Аб = Аб + 1; КонецЦикла; Если Результат >= МинимальнаяДлина И Результат <= Длина Тогда Для Каждого Стр Из ВремТаблица Цикл Сообщить(Стр.Имя + " " + Стр.Размер) КонецЦикла; Сообщить("-" + Результат + "-"); КонецЕсли; ВремТаблица.Очистить(); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |