[Homework]AdvancedC# - Files and Streams
Домашното не е качено . Може ли да го качите ? Друг път се качват презентацията, демата, домашното първи след това и видеото .
Евентуално темата може да се ползва и за споделяне на решения по домашното .
Домашното не е качено . Може ли да го качите ? Друг път се качват презентацията, демата, домашното първи след това и видеото .
Евентуално темата може да се ползва и за споделяне на решения по домашното .
Вчера на лекцията казаха, че домашното ще бъде качене днес (респективно сроковете за това домашно ще бъдат удължени).
Привет,
Домашното вече е качено, а срокът ще удължим с 1 ден. :)
Здравейте колеги,
Продължавам темата с първите задачи от домашното, плюс една от допълнителните:
Едит:
Problem 6. Zipping Sliced Files
Работещи решения - оптимизирани благодарение съвета на Наско за размера на буфера и идеята на Асен за контрола на размера на part-files; иначе са направени изцяло по условие - с FileStreams, и без използване на File class.
Problem 7. Directory Traversal
Problem 8. *Full Directory Traversal
Problem 11. *Couples Frequency
Здравейте, ще използвам темата за питам дали някой е решил 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);
но последното не подрежда резултатите по размер на файла.
Мисля, че големината на файловете не трябва да оказва влияние върху подредбата на външните ключове. Т.е. първо си сортирай extension-ите според това колко файла имат, или по азбучен ред. След като приключиш с това, сортирай вътрешните записи по големина на файла. Така както се опитваш, понеже няма два еxtension-a с еднакво име, няма и как да стигнеш до последния .ThenBy. A дори и да стигнеш, резултатът няма да е коректен.
malkstor, в условието има една ключова дума - grouped ( ... files should be grouped by their extension ... ), която ще ти подскаже как да подходиш. Може да погледнеш моето решение.
Благодаря колеги, но групирането по разширение и после сортиране по брой файлове си работи ок, само последната част с размера на файловете не е ок. Ето до къде съм стигнал: http://pastebin.com/B8LUgZ9s.
Сега като гледам решението на колегата nstanevski, вероятно ще сменя речника от речници с лист от предефиниран тип данни. В началото исках така да го направя, но не се досетих как точно.
И аз имам въпрос за 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-ва нормално.
Може ли нещо да се подобри или с някои типове инпут файлове създадените парчета ще си останат дефектни и неизползваеми?
Ето кода - предварително благодаря за всякакви идеи :)
Само първото парче можеш да отвориш, понеже всеки бинарен файл съдържа в началото си няколко байта описание за себе си. Без тях програмата, която го отваря, няма как да знае какво чете (mp3, avi, png и т.н.). Нормално е, когато нарежеш един файл на няколко части, хедърите му да останат само в първата част и затова плейърът разпознава само нея като валиден .avi файл.
Относно кода:
Аз зациклих на това: http://pastebin.com/yhQqMccP
Не мога да разбера защо ми дава Exception, че параметрите в четенето indexRead и buffer.Length са невалидни.
.Read(buffer, indexRead, buffer.Length) работи по следния начин - чете толкова байта, колкото да напълни буфера от indexRead до buffer.Length индекса. Затова indexRead не трябва да го увеличаваш, той винаги трябва да е 0, понеже искаш да пълниш буфера от началото до края.
Също така за всеки part трябва да си създаваш отделен изходен поток (т.е. отделен файл). В момента извършваш обикновено копие.
Здравейте, надявам се наякой да ми помогне с 5-та задача.
За опит съм избрал едно видео mp4, кодът го разбива на части, но само първата е валидна и се пуска, донякъде.
В цикъла за четене по-малкото от размера на byte [ ] или оставащите байтове до 1 част от файла. Идеята ми е накрая, да не прочита повече от 1 част и да не навлиза в другата..
Мерси
Когато файлът е разбит на части, нормално е само първата част да може да се пусне. Първият файл съдържа метаданни, които казват, че това е видео с еди-какви си характеристики и следователно може да го пуснеш с някакъв плейър. При другите файлове тези метаданни липсват и ОС и плейъра не знаят с какъв тип файл боравят.
Мерси за отговора. Това значи ли , че кодът е коректно написан?
Има още нещо, което не ми е съвсем ясно.
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кб, и така преминаването ще е минимално.
Какво мислите?
Здравейте ... може ли малко помощ .... къде бъркам при разделянето или при събирането
относно Problem 5. Slicing File
Разделям снимки, видео .... всичко уж наред .....
събирам ги отново заедно (пробвах само със снимка) и резултата, е че виждам само една част най-отгоре на снимката
ето го и решението ми : https://gist.github.com/alexeitcekov/09db12427a4bca704b19
някой ще може ли да погледне ? :)