Софтуерно Инженерство
Loading...
+ Нов въпрос
NikolayUzunov avatar NikolayUzunov 7 Точки

[Homework]AdvancedC# - Files and Streams

Домашното не е качено . Може ли да го качите ? Друг път се качват презентацията, демата, домашното първи след това и видеото .

Евентуално темата може да се ползва и за споделяне на решения по домашното . 

Тагове:
3
C# Advanced
Kamigawa avatar Kamigawa 750 Точки

Вчера на лекцията казаха, че домашното ще бъде качене днес (респективно сроковете за това домашно ще бъдат удължени).

2
a_rusenov avatar a_rusenov 1103 Точки

Привет,

Домашното вече е качено, а срокът ще удължим с 1 ден. :)

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравейте колеги,

Продължавам темата с първите задачи от домашното, плюс една от допълнителните:

Problem 1.Odd Lines

Problem 2 .Line Numbers

Problem 3. Word Count

Problem 4. Copy Binary File

Problem 9. * Disk

Едит:

Problem 5. Slicing File

Problem 6. Zipping Sliced Files

Работещи решения - оптимизирани благодарение съвета на Наско за размера на буфера и идеята на Асен за контрола на размера на part-files; иначе са направени изцяло по условие - с FileStreams, и без използване на File class.

Problem 7. Directory Traversal

Problem 8. *Full Directory Traversal

Problem 11. *Couples Frequency

 

7
23/05/2015 00:33:44
malkstor avatar malkstor 348 Точки

Здравейте, ще използвам темата за питам дали някой е решил 5-та задача. Мен ме затрудни, а понеже и 6-та един вид зависи от нея, минах направо на 7-ма, с която съм почти готов, но не мога да оправя нещо сортирането по големина на файловете.

Направил съм си един Dictionary<string, Dictionary<string, double>>, като първия стринг е разширението, а втория - името, и съответно Double-а е размера на файла.

Сортирането го правя така:

var sortedOutput = dir
            .OrderByDescending(filesCount => filesCount.Value.Keys.Count)
            .ThenBy(extension => extension.Key)
            .ThenBy(size => size.Value.Values);

но последното не подрежда резултатите по размер на файла.

1
21/05/2015 18:34:04
enevlogiev avatar enevlogiev 1169 Точки

Мисля, че големината на файловете не трябва да оказва влияние върху подредбата на външните ключове. Т.е. първо си сортирай extension-ите според това колко файла имат, или по азбучен ред. След като приключиш с това, сортирай вътрешните записи по големина на файла. Така както се опитваш, понеже няма два еxtension-a с еднакво име, няма и как да стигнеш до последния .ThenBy. A дори и да стигнеш, резултатът няма да е коректен.

2
21/05/2015 21:37:51
nstanevski avatar nstanevski 37 Точки

malkstor, в условието има една ключова дума - grouped ( ... files should be grouped by their extension ... ), която ще ти подскаже как да подходиш. Може да погледнеш моето решение.

3
malkstor avatar malkstor 348 Точки

Благодаря колеги, но групирането по разширение и после сортиране по брой файлове си работи ок, само последната част с размера на файловете не е ок. Ето до къде съм стигнал: http://pastebin.com/B8LUgZ9s.

Сега като гледам решението на колегата nstanevski, вероятно ще сменя речника от речници с лист от предефиниран тип данни. В началото исках така да го направя, но не се досетих как точно.

2
KatyaMarincheva avatar KatyaMarincheva 572 Точки

И аз имам въпрос за Problem 5. Slicing Files - стигнах до работещо решение, което уж изпълнява всички условия на задачата: взема инпут файл, разцепва го на файлове с равен размер и със същия extension,  после събира малките файлове отново в цял assembled файл:

Изпробвах решението със следните инпут файлове:

.txt file - всички парчета и assembled.txt работят идеално

.jpg file - всички парчета са damaged според windows photo viewer, assembled.jpg се отваря нормално

.avi file - само първото парче се play-va нормално - всички други парчета не се play-ват, assembled.avi се play-ва нормално.

Може ли нещо да се подобри или с някои типове инпут файлове създадените парчета ще си останат дефектни и неизползваеми?

Ето кода  - предварително благодаря за всякакви идеи :)

-1
22/05/2015 10:50:27
a_rusenov avatar a_rusenov 1103 Точки

Само първото парче можеш да отвориш, понеже всеки бинарен файл съдържа в началото си няколко байта описание за себе си. Без тях програмата, която го отваря, няма как да знае какво чете (mp3, avi, png и т.н.). Нормално е, когато нарежеш един файл на няколко части, хедърите му да останат само в първата част и затова плейърът разпознава само нея като валиден .avi файл.

Относно кода:

  1. Assemble не работи правилно, защото никъде не прочиташ от входния поток нищо (просто инициализираш празен байт масив и го записваш в изходния поток). Ползвай partSource.Read(...).
  2. Навсякъде четеш целия файл наведнъж - това е ок за малки файлове, но става проблем при големи (да кажем 1 гб.), защото зареждаш всичко в РАМ и рискуваш OutOfMemoryException. По-правилно е да имаш буфер от 4096 байта (препоръчелна дължина при работа с Уиндоус) и малко по малко да четеш от входния поток, същевременно записвайки в изходния.
  3. SafeFileHandle ImagePath най-долу не ти трябва :)
3
malkstor avatar malkstor 348 Точки

Аз зациклих на това: http://pastebin.com/yhQqMccP

Не мога да разбера защо ми дава Exception, че параметрите в четенето indexRead и buffer.Length са невалидни.

0
22/05/2015 10:20:39
a_rusenov avatar a_rusenov 1103 Точки

.Read(buffer, indexRead, buffer.Length) работи по следния начин - чете толкова байта, колкото да напълни буфера от indexRead до buffer.Length индекса. Затова indexRead не трябва да го увеличаваш, той винаги трябва да е 0, понеже искаш да пълниш буфера от началото до края.

Също така за всеки part трябва да си създаваш отделен изходен поток (т.е. отделен файл). В момента извършваш обикновено копие.

3
alex.mitev avatar alex.mitev 20 Точки

Здравейте, надявам се наякой да ми помогне с 5-та задача. 

За опит съм избрал едно видео mp4, кодът го разбива на части, но само първата е валидна и се пуска, донякъде. 

http://pastebin.com/3GVfy2f8

В цикъла за четене по-малкото от размера на byte [ ] или оставащите байтове до 1 част от файла. Идеята ми е накрая, да не прочита повече от 1 част и да не навлиза в другата..

Мерси

 

0
Filkolev avatar Filkolev 4428 Точки

Когато файлът е разбит на части, нормално е само първата част да може да се пусне. Първият файл съдържа метаданни, които казват, че това е видео с еди-какви си характеристики и следователно може да го пуснеш с някакъв плейър. При другите файлове тези метаданни липсват и ОС и плейъра не знаят с какъв тип файл боравят.

1
alex.mitev avatar alex.mitev 20 Точки

Мерси за отговора. Това значи ли , че кодът е коректно написан?

Има още нещо, което не ми е съвсем ясно.

int partSize = (int)Math.Ceiling( (double)inputStream.Length / parts); - това лесно може да превърти, поради големината и има логика да е long.

long partSize = (long)Math.Ceiling( (double)inputStream.Length / parts); 

когато е лонг обаче, следният ред не е валиден (castnal съм го към int, за да работи):

int bytes = inputStream.Read(buffer, 0, (int)Math.Min(partSize - bytesRead, buffer.Length));

Какво ще стане, ако не използвам дължина на записаните байтове колкото е остатъка до достигане на partSize, a използвам  направо buffer.Lenght? Така рискувам записаните файлове да преминат големината на определените partSize. Евентуално решение е да намаля размера на буфера до 4кб, и така преминаването ще е минимално. 

Какво мислите?

0
alexei.tcekov avatar alexei.tcekov 33 Точки

Здравейте ... може ли малко помощ .... къде бъркам при разделянето или при събирането

относно Problem 5. Slicing File

Разделям снимки, видео  .... всичко уж наред .....

събирам ги отново заедно (пробвах само със снимка) и резултата, е че виждам само една част най-отгоре на снимката

ето го и решението ми : https://gist.github.com/alexeitcekov/09db12427a4bca704b19

 

0
alexei.tcekov avatar alexei.tcekov 33 Точки

някой ще може ли да погледне ? :) 

0