Страницы

Поиск по вопросам

Показаны сообщения с ярлыком файлы. Показать все сообщения
Показаны сообщения с ярлыком файлы. Показать все сообщения

понедельник, 13 апреля 2020 г.

Функция fread: остановится ли считывание при наличиии \0?

#c #файлы #функции

                    
Здравстdуйте! Допустим у нас есть файл. Мы его открыли, а потом считываем оттуда
информацию с помощью fread. Вопрос: а если в файле есть \0, то fread остановится считывать
информацию на \0 или будет дальше считывать информацию до конца файла.    


Ответы

Ответ 1



Вопрос на самом деле не дурацкий :-) Вообще - чтение файла ф-цией fread не заканчивается при достижении какого-либо символа, только лишь при ошибках ввода-вывода или если файл закончился. Посмотреть описание ф-ции можно в справочниках. Например, здесь или здесь

Java I/O для объёмных данных

#оптимизация #файлы #java

                    
Нужен совет опытных по поводу производительности Java I/O и много другого. Задачка
такая - в нескольких потоках клиент шлет http post запрос весом до 1 мб каждый, в ответ
приходят еще больший по весу (2-4 мб) ответ в формате JSON, который нужно спарсить
и аккуратно завернуть в .csv файл. Количество запросов может доходить до десятков тысяч,все
ответы сервера пишутся в 1 файл. Сервер один и тот же. (что делать с Keep-Alive ? )
. Соответственно возникает вопрос - а какие инструменты при этом использовать ?

Соединение: HttpClient / HttpUrlConnection /Netty/etc
Чтение ответа : BufferedReader/Scanner/etc
Чем Json парсить ? jackson/gson/simple json
Чем писать в файл, и нужно ли вообще писать во время работы или же лучше кидать в
какой нибудь ArrayList, потом спарсить и записать.

В общем, буду рад любым советам и подсказкам)
Вопрос не мой, просто помогаю человеку :)    


Ответы

Ответ 1



Здравствуйте @Михаил М. сказать, что Вы как-то смутно задали вопрос это тоже самое что вообще ничего не сказать). производительности Java I/O - во первых уточнили бы какую яву собираетесь использовать. в любом случае у Вас будет многопоточность сразу советую смотреть в сторону java concurrency apis. думаю появится много проблемм и ожиданий в очередях пока Вы будете парсить такие обьемы а потом еще и записывать в один файл. - это какая-то жесть(возможно я не правильно понял задачу) тем более что запросов до десятков тысяч. что значит что делать с keep-alive ?, если я правильно понимаю у каждого request/response - свое время жизни и регулироваться они будут самостоятельно. ну да и по порядку: 1 - для запросов мне в мобильных разработках помогла и хорошо себя зарекомендовала вот эта либа http-request - там сразу на страничке все описано в доль и поперек 2 - здесь тоже все может выполнить предыдущая либа. 3 - gson - себя зарекомендовал с очень хорошей стороны, хоть и не без косяков)) 4 - я не понимаю почему все в один файл, возможно стоило вначале описать функциональность которую Вы хотите в итоге добиться, я бы хронил уже готовые для записи .csv в мапке и завел бы отдельный поток который бы и записывал их поочередно. это спосет Вас от многопоточного доступа к файловой системе. и позволит как минимум всем потокам по очереди получать право на запись в мапку, и постоянное право у записывающего потока на чтение из нее. касаемо первых двух пунктов могу сказать еще только что если пользоваться стандартными средствами то я бы использовал BufferedInputStream и HttpUrlConnection

Ответ 2



1.) Для объемных файлов конкретный api особо не влияет на скорость передачи, все упрется в возможности железа. Заморачиваться с nio стоит, если есть например много легких соединений, и есть проблемы с переключениями контекстов. Так что выбирайте удобный, отлаженный api. Я бы взял apache http client 4. 2) BufferedReader - хорошее решение 3) Я бы взял jackson - мощный и быстрый. Gson скорее более специализированное решение для конвертации между бинами и json. 4) Писать лучше во время работы из другого потока, будет pipelinig. И запись конечно должна быть буферизованной, например через BufferedWriter. Keep alive лучше выключить. Файлы большие, время установки соединений ничтожно меньше времени передачи. Только морока будет с настройкой сервера. Еще советую на клиенте и сервере установить размеры tcp буфферов в один мегабайт, алгоритм нигла оставить включенным, scaling tcp окна тоже оставить включенным. И еще общий совет: делай каждую стадию отдельной группой потоков, потоки соединяй очередями. Это называется SEDA. Так ты сможешь получить максимальную пропускную способность. Кстати, увеличение длин очередей увеличивается пропускную способность, но ухудшает latency. Имей в виду. Автор ответа - Денис Боровиков, [http://vk.com/id36765][1]

суббота, 11 апреля 2020 г.

Как обратиться к локальному файлу по ссылке в приложении Chrome

#google_chrome #файлы #javascript #изображения

                    
Доброго времени суток!
Можно-ли получить доступ к локальному файлу из приложения или расширения под Chrome
используя пути такого вида:

file:///C:\Folder\File.jpg 
C:\Folder\File.jpg

При попытке создать объект File() из локальной ссылки появляются ошибки:

Error: GET chrome-extension://acnoddeoamaikpmmdkehnkppmcgcpfjl/C:ImagesTestcat.jpg
net::ERR_FILE_NOT_FOUND
Not allowed to load local resource: C:\Images\myjpeg.jpg

За полным разъяснением этого вопроса смотреть мой ответ.    


Ответы

Ответ 1



Приложение или расширение Chrome не может получить доступ к локальному файлу напрямую, так как это было бы серьезным нарушением безопасности. Конечно, это ограничение можно обойти, как мне объяснили на stackoverflow через Native host. Правда, лично я не пробовал этого делать, так как свою проблему решил просто сохранением локальных файлов внутри Indexed BD. Подробнее обо всех известных мне способах хранения файлов и последующей работы с ними читайте далее. Работа с файлами через Indexed BD. Как сохранить файл в indexedbd? Ответ с разъяснениями здесь. Как получить файл по сети и сохранить в indexedbd? Ответ здесь. Используем FileSystem API для сохранения и работы с файлами. Справка по FileSystem API. Статья о работе с FileSystem API. Local Storage & Session storage & Cookie Storage Как работать с cookie storage? Справка здесь. Как сохранить файл в local storage? Как работать с session storage (временное хранилище)? Сами файлы (их объекты) для работы с ними Вы можете получить через drag&drop или . Почитать подробнее о том, как это делается с примерами и последующим разбором полетов можно здесь. Надеюсь, что ответ объяснил хотя бы поверхностно о работе с файлами в приложениях и расширениях Google Chrome.

Ответ 2



Тут нужно немного по-другому. Попробуйте путь file://C:/0.JPG

Как убрать BOM из файла?

#файлы #unix #unicode

                    
Как консольно (в Unix-like окружении) удалить BOM (byte-order mark, непечатаемый
символ в самом начале файла, являющийся необязательной меткой юникода) из файла?
    


Ответы

Ответ 1



Например, с помощью awk: awk '{if(NR==1)sub(/^\xef\xbb\xbf/, "");print}' < oldfile > newfile

Ответ 2



Если точно знаете, что файл с BOM $ tail -c +4 newfile эффективно копирует все, пропустив первые 3 байта (см. man tail for details)

Ответ 3



С помощью sed: $ sed -e '1s/^\xef\xbb\xbf//' < bomfile > newfile Если заранее известно, что файл содержит BOM, то можно использовать dd: $ dd if=bomfile of=newfile bs=3 skip=1

четверг, 9 апреля 2020 г.

Прочитать с середины файл без чтения его начала на Rust'е

#файлы #потоки_данных #filestream #rust #fstream

                    
let f = File::open("file").unwrap();
let reader = BufReader::new(f).seek(io::SeekFrom::Start(2));
for b in reader.iter().next() {
    println!("{}", b);
}


Выводит то, что находится внутри io::SeekFrom::Start, т.е. 2.
    


Ответы

Ответ 1



Какой-то странный цикл у вас. По идее должно быть как-то так: let f = File::open("file").unwrap(); let mut reader = BufReader::new(f); reader.seek(io::SeekFrom::Start(2)).unwrap(); for b in reader.bytes() { println!("{}", b); } Метод seek() возвращает Result, то есть новую позицию в файле. Он вызывается на &mut self, значит reader должен быть mut, иначе не заработает. Что делает ваш код: вы открываете файл и смещаете указатель на 2 байта, сохраняя Result в reader. Потом вы преобразовываете Result в итератор с помощью iter() и вызываете на итераторе next(), получаете Option, равный Some(2). А потом по опции итерируете (Option<_> реализует IntoIterator, так что этому типу можно итерировать). Итератор весело выдаёт один элемент — 2. Чтобы избежать подобных ошибок в будущем, внимательно читайте документацию на используемые трейты и типы: ни в трейте Read, ни в типе BufReader нет метода iter(), однако в Read есть метод bytes(), который вам был нужен. А вот метод Seek::seek возвращает Result. Кроме того стоит больше прочитать про интерфейс итераторов, так как вы, судя по всему, до конца не поняли эту идею, раз вызываете на итераторе метод next() явно.

четверг, 19 марта 2020 г.

Перенос папок в папку

#файлы #php


Есть папка A
Есть папка Б
Нужно перенести содержимое Б в А. Содержимое может совпадать по имени.
Т.е. если совпали папки, то просто переносится содержимое папки, если совпали файлы,
то перезаписываются. Если папки нет, то создается и переносятся данные. Здесь очень
похожая функция, но не работает с совпадениями. Думаю многие встречались с подобным.
p.s. как запасной план, использовать линуксовые возможности.    


Ответы

Ответ 1



Создается функция которая принимает на вход путь и создаёт папки для этого пути. (например, mkdirs('/home/pupkin/dirs/A'); на каждой папке проверяет её существование, если папки не существует - то создаём её если существует то ничего не делаем, переходим к вледующей части пути) Создаётся функция рекурсивного копирования. recursiveCopy($from, $to) читаем содержимое папки $from в цикле: если это файл то: копируем его из $from.'/'.$file в $to.'/'.$file если это папка: mkdirs($to.'/'.$file); recursiveCopy($from.'/'.$file, $to.'/'.$file); вот и всё.

Ответ 2



Вот, готовый код. $from - откуда копируем, $to - куда. Пути задавать полные (ну по крайне мере у меня работает так, если $from/$to = '../from/'/'../to/') Одно, что папки from и to должны быть указаны, остальные папки, которые есть в папке from, в to создаются сами, удачной работы)) function recursiveCopy($from, $to){ if(!file_exists($to)){ mkdir($to); } if ($objs = glob($from."/*")) { foreach($objs as $obj) { $forto=$to.str_replace($from, '', $obj); // echo $to.'
'; if(is_dir($obj)){ removeDirRec($obj, $forto); } else{ copy($obj, $forto); } } } return true; }

Создание Shell Extentions

#c_sharp #файлы #ntfs


Здравствуйте, Уважаемые Хэшкодовцы!
Благодаря Вам узнал об альтернативных потоках данных для файлов на NTFS системе.
Благодаря интернету научился с ними работать через командную строку. Может кому интересно:
echo some file > file.txt

создали/перезаписали информацию в файлу "file.txt" текстом "some file"
echo some description > file.txt:desc

создали/перезаписали альтернативный поток с именем "desc" для файла "file.txt"
more < file.txt
type file.txt

отобразили в окне консоли информацию содержащейся в файле "file.txt". В нашем случае
"some file"
more < file.txt:desc

отобразили в окне консоли информацию из альтернативного потока с именем desc.
dir /r

отобразили список всех файлов в текущем каталоге с их альтернативными потоками

В общем выше была лирика, это может кому пригодится. Теперь собственно сам вопрос:
Как реализовать окно свойств, которое отобразит данные из альтернативного потока
В интернете нахожу много информации, как реализовать свою Shell Extentions. Но информации
очень много на английском языке (или я просто не могу найти аналогичной информации
на русском), что сильно затрудняет поиски решения с моими познаниями "вражеского" языка.
Многие примеры рассказывают как перехватить выполнение команды, как добавить в контекстное
меню файлов свои пункты, но это все не то. Мне нужно открыть окно свойств файла, в
открывшемся окне свойств добавить свою закладку с конкретным именем, на закладке расположить
компонент позволяющий просматривать текстовую информацию (ну пусть скажем это будет
RichTextView) ну и поместить туда информацию из альтернативного потока с конкретным
именем. 
Как читать информацию из альтернативного потока примеры я нашел, думаю разберусь
самостоятельно, а вот реализацией персональной закладки свойств для файла - увы не
получается. На всякий случай уточню, расширений файлов будет несколько, для которых
данное окно свойств должно появиться (ну например это будут .ex1, .ex2), и если есть
такая возможность, окно свойств не отображать, в случае если альтернативного потока
данных с нужным именем отсутствует у файла).
Забегая немного вперед, хотел бы еще возможность отображать окно свойств для нескольких
выбранных файлов, но с этим сначала попробую сам разобраться.
Что собственно хочу от вас?

Желательно ссылку на документацию по моей проблеме. Как я понял, махинаций которые
можно вытворять при помощи Shell Extentions навалом, человеку который этим никогда
не занимался - темный лес.
Если есть конкретный пример подобной реализации на c# - буду признателен. Желательно
конечно, чтобы код не был навороченным, достаточно самых основ, далее будем плясать
от печки по принципу удочки.
Ну и самое "здоровское" для меня, как для начала изучения проблемы - это подсказка,
с чего начать писать модуль? Какие интерфейсы должны быть реализованы?

PS: Если все это будет еще и на русском языке - вообще вам цены не будет =)
Заранее спасибо, что дочитали все это до конца, и за ваши ответы.    


Ответы

Ответ 1



В силу ряда проблем Microsoft не рекомендует писать расширения для обозревателя с помощью управляемого кода и не планирует поддерживать разработку подобных расширений. На неуправляемом коде добавление страницы свойств происходит согласно руководству (на английском): How to Register and Implement a Property Sheet Handler for a File Type. Если все же браться за расширение на C#, то в качестве исходной точки можно взять готовый проект на C# (на английском): Property Sheet Shell Extension in C#.

Ответ 2



Ваша проблема уже давно решена. Могу дать пример. AltStreamOverlay (с исходным кодом)

Как в C++ открыть на чтение текстовый файл размером 5 и больше ГБ?

#файлы #cpp


Насколько я понимаю, когда файл открывается на чтение, его содержимое записывается
в оперативную память. Есть ли у c++ какие-нибудь встроенные механизмы для работы с
большими файлами? Может как-то можно их открывать частично или скажем хранить буфер
не в оперативной памяти а в постоянной?
UPD:
Сделал вот так:
#include "stdafx.h"
#include 
#include 
#include 

using namespace std;

int main(array ^args){
    char * buffer;      
    int len = 16384;    
    long t1 = clock();

    cout << "Opening file..." << endl;

    ifstream infile("filename1", ios::in | ios::binary); 
    ofstream outfile("filename2", ios::out | ios::binary);

    if(!infile || !outfile){ 
        cout << "Can not open file!" << endl;
        system("PAUSE");
        return 1;
    }

    cout << "Done!" << endl;
    cout << "Please wait! Copying file..." << endl;

    buffer = new char[len]; 
    while (!infile.eof()){
        infile.read(buffer, len);
        if(infile.gcount()) {
            outfile.write(buffer, infile.gcount());
        }
    }

    infile.close();
    outfile.close();

    delete[] buffer;

    long t2 = clock();

    cout << "Done!" << endl; 
    cout << "Time: " << (t2 - t1)/1000/60 << " minut."<< endl;

    system("PAUSE");
    return 0;
}
    


Ответы

Ответ 1



Нет, при открытии файла ты получаешь его хэндл, но в память он загружается, когда ты его считываешь. Например (fread).

вторник, 17 марта 2020 г.

Чтение файла построчно

#cpp #файлы


Нужно открыть файл и прочитать его построчно, то есть взять первую строку занести
её в переменную, проделать с ней определённые операции, потом брать вторую и т.д.
    


Ответы

Ответ 1



ifstream file(fileName);//создаем объект потока istream по имени file // который инициализируется именем fileName, //вызывается функция file.open(); string str; //переменная стринг для строки while(getline(file,str)) //getline(istream & is, string &s,char c='\n'),читает из потока is, в строку s пока { //не встретит символ c (без этого символа до новой строки) // возвращает свой объект istream, в условии проверяется состояние iostate флагa, значение этого флага будет ложным, если достигнет конца файла, или будет ошибка ввода или читаемого типа fncn(str); // вызываем нужною функцию для полученной строки }

Ответ 2



вот код не вырванный из контекста #include #include // подключаем строки #include // подключаем файлы using namespace std; // используем стандартное пространство имен int main(){ string s; // сюда будем класть считанные строки ifstream file("C:\\PriceList.dat"); // файл из которого читаем (для линукс путь будет выглядеть по другому) while(getline(file, s)){ // пока не достигнут конец файла класть очередную строку в переменную (s) cout << s << endl; // выводим на экран s += "+"; // что нибудь делаем со строкой например я добавляю плюсик в конце каждой строки cout << s << endl; // и снова вывожу на экран но уже модифицированную строку (без записи ее в файл) } file.close(); // обязательно закрываем файл что бы не повредить его return 0; }

воскресенье, 15 марта 2020 г.

Не срабатывает fputs

#cpp #c #файлы #filestream


#include 
using namespace std;
int main()
{
    char tmpstr[255];
    FILE *stream;

    stream = fopen("ase.txt", "r+");

    fgets (tmpstr, 255, stream);
/*  fseek(stream, 0, SEEK_CUR);     */
    fputs("spice", stream);             // fprintf(stream, "%s","spice");  

    fclose(stream);
    return 0;
}


Почему-то не происходит запись в файл, однако, если раскомментировать строчку fseek
- запись происходит. Аналогичная ситуация, если использовать fprintf вместо fputs.
Почему так происходит?
    


Ответы

Ответ 1



Согласно стандарту С (7.21.5.3 The fopen function) 7 When a file is opened with update mode ('+' as the second or third character in the above list of mode argument values), both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek, fsetpos, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters endof-file. Opening (or creating) a text file with update mode may instead open (or create) a binary stream in some implementations. Таким образом, вы не можете выполнять операцию записи в файл сразу же после операции чтения файла без промежуточного вызова одной из функций: fflush, fseek, fsetpos, или rewind

Как прочитать очень большой текстовый файл?

#c_sharp #файлы #текст


Имеется текстовый файл содержащий всего одну строку, но размер файла 1 Гб. Каким
образом прочитать файл целиком? File.ReadAllLines, File.ReadLines, File.ReadAllText
завершаются с ошибкой о недостаточности памяти. На выходе нужно получить строку (объект
типа string) с содержимым из файла. Файл одно строчный, но строка очень длинная.
    


Ответы

Ответ 1



Нашел подробное описание причин этой ошибки вот здесь: ссылка. Всем спасибо за помощь, в данный момент использую такой код: char[] buffer = new char[104857600]; string text = ""; FileStream fstream = new FileStream("document.txt", FileMode.Open, FileAccess.Read); using (var sr = new StreamReader(fstream)) { int bytesRead = 0; while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0) { text = new string(buffer); // обработка текста } }

Ответ 2



Соберите приложение под AnyCPU и снимите в свойствах проекта чекбокс "Prefer 32 Bit". Пропишите в конфиге приложения Это снимет большую часть ограничений по памяти, и вашу строку можно будет спокойно прочитать целиком.

Ответ 3



Используй значит MemoryMappedFile.

воскресенье, 8 марта 2020 г.

Из текстового файла в строки C#

#c_sharp #строки #файлы


Допустим есть текстовый файл, в котором в каждой строке лежит слово и последовательность
цифр. Как мне поместить в одну строку только слова, а в другую - только цифры?

Пример файла:

testText0 1 2 3 4
testText1 2 4

    


Ответы

Ответ 1



Кроме решений в лоб всегда остаётся вариант использования регулярных выражений. using System.Text.RegularExpressions; ........ var Lines = File.ReadAllLines("MyFileName.txt"); var RegEx = new Regex(@"^([a-zA-Z]+)([\d\s]+)$"); var Words = new List(); var Digits = new List(); foreach (var Line in Lines){ var Matches = RegEx.Match(Line); Words.Add(Matches.Groups[1].ToString()); Digits.Add(Matches.Groups[2].ToString()); } Этот подход хорош еще и тем, что он автоматически валидирует входные данные. Проверить регулярные выражения можно тут.

Ответ 2



Ну например как-то так: var digits = "0123456789".ToArray(); var lines = File.ReadLines(path); var linesWithBreakingIndices = lines.Select(line => new { line, index = line.IndexOfAny(digits) }).ToList(); var justWords = string.Join(" ", linesWithBreakingIndices.Select(li => li.line.Substring(0, li.index))); var justDigits = string.Join(" ", linesWithBreakingIndices.Select(li => li.line.Substring(li.index))); Вариант без LINQ: var digits = "0123456789".ToArray(); var lines = File.ReadLines(path); StringBuilder justWordsBuilder = new StringBuilder(), justDigitsBuilder = new StringBuilder(); var first = true; foreach (var line in lines) { var index = line.IndexOfAny(digits); if (!first) { justWordsBuilder.Append(' '); justDigitsBuilder.Append(' '); } justWordsBuilder.Append(line, 0, index); justDigitsBuilder.Append(line, index, line.Length - index); first = false; } var justWords = justWordsBuilder.ToString(); var justDigits = justDigitsBuilder.ToString();

Удаление директории

#c_sharp #файлы


Пытаюсь удалить папку, содержащую файлы ( в моём случае png)

Directory.Delete("Pictures");


Вылезает исключение,которое сообщает, что папка не пуста и удаление невозможно. Каким
образом я могу избавиться от этой директории, не прибегая к удалению всех файлов, которые
она содержит?
    


Ответы

Ответ 1



https://msdn.microsoft.com/en-us/library/fxeahc5f(v=vs.110).aspx Directory.Delete("Pictures", true);

суббота, 7 марта 2020 г.

Запись в бинарный файл структуры

#cpp #файлы #app


Доброго дня. По заданию требуется записать в бинарник несколько массивов структур. 
Как я делал: передаю массив и размер в функцию, считываю из файла первые четыре байта(int),
меняю размер, так как дозаписываю. Закрываю файл, открываю вновь. Записываю поверх
старого размера новый размер. Затем, вновь закрываю файл, открываю вновь с дозаписью
в конец(!!!), и записываю содержимое массива. 
Как это работает: если один раз записать массив структур и считать его обратно -
то все нормально. Если дозаписать ещё один массив структур..то он не дозаписывается.
Отладчиком определил, что поток для записи в конец не открывается нужным образом(функция
tellp() возвращает 0, то есть курсор в самом начале файла, и писать будет сверху старого
содержимого). Вот функция:

void write_file(std::string name, bank *b, int s)
{
std::ifstream file_r(name, std::ios::binary);
int tmp_size(s);
if (file_r)
{
    int size(0);
    file_r.read((char*)&size, sizeof(int));
    s += size;
    file_r.close();
}
std::ofstream file(name, std::ios::binary);
file.write((char*)&s, sizeof s);
file.close();
file.open(name, std::ios::out | std::ios::app |  std::ios::binary);  // НЕ ДОЗАПИСЫВАЕТ
int pos = file.tellp();  // файл открывается в начале 
for (int i(0); i < tmp_size; i++)
{
    int count = b[i].name.length();
    file.write((char*)(&count), sizeof(int)); // размер строки
    file.write(b[i].name.c_str(), count); // пишем строку
    file.write((char*)&b[i].num, sizeof(int));
    file.write((char*)&b[i].code, sizeof(int));
    file.write((char*)&b[i].sum, sizeof(int));
    file.write((char*)&b[i].data, sizeof(date));
}
file.close();
}


Надеюсь, я нормально преподнес информацию. Спасибо заранее.
    


Ответы

Ответ 1



Просто сразу откройте файл для записи в режиме чтение-запись и без append: std::ofstream file; file.open(name, std::ios::binary | std::ofstream::out | std::ofstream::in); это предотвратит truncate файла и позволит произвольно менять его содержимое. Вы окажетесь в начале файла для записи нужного размера, а затем можно переместиться в конец file.seekp(0, std::ios_base::end); Однако, если файла еще нет, то его нужно создать, поэтому проще всего добавить в начало кода (перед открытием на чтение-запись) пару строк file.open ("test.txt", std::ofstream::out | std::ofstream::app); file.close(); А можно не морочить никому голову и открыть файл сразу создавая его, если такого еще нет в удобном для чтения-обновления-дозаписи режиме, используя POSIX: int fd = open(name, O_RDWR | O_CREAT, 0666); FILE *f = fdopen(fd, "r+");

Ответ 2



Вам нужен соответствующий флаг при открытии файла, попробуйте так: std::ifstream file(name, std::ios::binary | std::ios::app);

среда, 26 февраля 2020 г.

Сохранение отрисованного в Canvas'е в файл

#canvas #java #android #файлы


Здравствуйте. Программирую под систему Android OS. Пишу виджет-класс, наследующий
View. В методе обратного вызова (callback-method) - onDraw(Canvas canvas) происходит
отрисовка графических примитивов и Bitmap'ов по мере взаимодействия пользователя с
данным виджетом. Хотел бы реализовать метод, позволяющий сохранить все, что отрисовывалось
в ходе многократного вызова onDraw на canvas'е, в файл (.jpg, .png). 
Каким образом вообще осуществляется сохранение всего отрисованного в каком-то объекте
(в данном случае Canvas) в файл? Какая цепочка классов вообще нужна для такой операции?
С текстовыми и двоичными файлами были потоки StreamWriter, FileWriter и т.д. Подозреваю
и тут такое потребуется, но как вообще перейти от Canvas'а с его содержимым к конечному
файлу картинки?
И можно ли сохранять файлы изображений в какие-то общедоступные всем каталоги? Скажем,
есть ли в системе Android что-то наподобие "Мои Документы" или "Галерея"?
Заранее спасибо, и извините за слишком примитивные вопросы.    


Ответы

Ответ 1



По поводу вашего вопроса - ответ: StackOverflow И дарю метод сохранения картинки в галерею: private String saveImageToMediaStore(Bitmap source, String title, String desc){ return MediaStore.Images.Media.insertImage(getContentResolver(), source,title, desc); }

вторник, 25 февраля 2020 г.

С#: сравнение файла на веб-ресурсе и локальный файл

#c_sharp #веб_программирование #файлы #сравнение


Есть веб-сайт, на нем ссылка для скачивая файла "А". Есть локальная версия файла
А. Как можно их сравнить, чтобы не скачивать файл с интернета?

Есть идея  сравнивать контрольные суммы, но для этого файл с инета придется скачать.

Как-то это можно реализовать?
    


Ответы

Ответ 1



Может это поможет? Сравнивать даты. Наткнулся на просторах Интернета. http://www.cyberforum.ru/windows-forms/thread1346241.html

Ответ 2



Только через Head запрос, сервер выдаст информацию о файле в виде заголовка, ну и остальное от сервера зависит, и нужно по ответ Athari проверить заголовки

Ответ 3



Проверьте, поддерживает ли веб-сервер кэширование для файлов. Для этого используются заголовки типа "ETag", "Cache-Control" и другие. Например, если сервер при скачивании файла указывает "ETag", то вы можете запомнить эту строчку и при повторном запросе указать её в заголовке "If-None-Match". Если файл на сервере не изменился, то сервер вернёт вам соответствующий HTTP код (304 Not Modified) с пустым телом ответа, то есть будут скачаны только HTTP заголовки, но не сам файл. См. HTTP ETag.

Ответ 4



Есть элегантное решение с помощью bash однострочника diff myFile <(ssh myHost 'cat myFile') И да можно сравнить два файла которые вообще на разных хостах с помощью третьего хоста. diff <(ssh myHost1 'cat myFile') <(ssh myHost2 'cat myFile') Правда это конечно создаст SSH траффик примерно равный размеру файла, но фактически файл скорее всего не будет скачан на жесткий диск. P.S. Вместо cat можно написать md5sum, а diff заменить на if , чтобы сравнить хэши, совсем избавившись от траффика. Правда в таком случае будет непонятно чем конкретно файлы отличаются.

Как правильно хранить файлы на веб-сервере?

#php #файлы #хранение_данных


Я бы хотел задать кое-какие вопросы о построении каталогов и хранении в них файлов
(картинок, к примеру).

Прежде чем обратиться, я почитал не мало разных статей и у меня накопились вопросы.

Ни для кого не секрет, что для крупных проектов нецелесообразно скидывать загружаемые
пользователем файлы в одну папку и поэтому нужно раскидывать их по каталогам, но как
сделать это правильно?

Многие советуют делать это след. образом:
Вкратце опишу, генерируем название файла с помощью md5 хэша.
Затем, берем первые 2 символа из название и создаём папку и туда помещаем все файлы,
которые начинаются на одни и те же символы, подобным образом мы можем создать 256 папок
в которые, к примеру, мы можем поместить по 1000 файлов. Разумеется, можно делать вложенные
уровни из 3 и 4 символа из 5 и 6 и тд.

Но я не могу понять, что будет, если одна из папок забьется гораздо раньше чем другие?
Как в таком случае быть?

Мой вариант, который пришел в голову (Думаю, я не первый):
Создаем папку с числом текущего года, к примеру, затем текущего месяца и в папке
с числом месяца создаем папку с днем месяца и в ней создаем папку с названием 1 и забиваем
её до тех пор пока в ней не будет 1000 файлов, затем создаем папку с числом 2 и забиваем
её, ну и в таком же духе и дальше.

Выходит, если мы будет хранить в папке до тысячи папок и в этих папках до тысячи
файлов, то у нас в одной папке которая названа числом месяца может храниться до 30
000 000 файлов. После того как месяц закончился переходим к другому, закончился год,
переходит к другому...
Файловой системе в таком случае не придется тонны файлов разгребать, максимальное
число файлов с которыми придется ей работать это 1000

Для наглядности:
2015/04/15/1

Забиваем папку с названием 1 до 1000 файлов, затем создаем папку с названием 2, после
3 и так до 1000

Закончился день, тогда создаем в папке 04 папку 16 и дальше по описанному принципу
работаем.
Разумеется, папки создаются только тогда, когда в них грузятся файлы.

Какие у вас мысли по этому поводу? Какую структуру хранения файлов используете вы?
И чем она хороша? Приемлема ли та структура которую описал я, с вашей точки зрения?
Что скажете по поводу производительности?
    


Ответы

Ответ 1



Ответ достаточно общий, без всякой привязки к PHP. Если требуется поиск файлов по имени, то я бы попробовал все же сделать структуру, основанную на MD5 (или другой хэш-функции) в 16-ричном виде (для MD5 все имя это 32 символа от 0 до f), только не с жесткой организацией уровней каталогов, а с динамической. Имена каталогов задаются, например, тройками символов. Соответственно, каталог может содержать до 4096 других каталогов. Для начала начинаем помещать в каталог сами файлы (с MD5-именем). Можно еще завести там служебный файл для отображения хэша в имя (может пригодиться, если захотите узнать реальные имена хранимых файлов) и синонимов (вдруг такое произойдет). Впрочем, структура такого файла -- это отдельный вопрос. Когда в каталоге соберется 4096 файлов мы проводим реорганизацию. Делаем по первой тройке символов имен файлов каталоги и перемещаем файлы в них. Надеюсь, далее очевидно.

Ответ 2



что будет, если одна из папок забьется гораздо раньше чем другие? Странный вопрос. С какой стати одна должна забиться раньше? Это ведь рандомный хэш, а не пользовательское имя файла на IMG_. Ну да, хэш надо генерировать с умом. Но это проблема генерации хэша, а не самого принципа. То есть я не понимаю логику, стоящую за этим доводом. Это все равно что решать, чем есть борщ, и отказаться от ложки только потому, что кто-то, возможно, её в руках не умеет держать. Ну так надо одного криворукого учить, а не всем хлебать через край. Чем система проще, тем она лучше работает. В простой системе нечему ломаться. Если изначально задать алгоритм, который не будет требовать никаких пересчетов и реорганизаций, то он и будет работать без необходимости каждый раз(!) файлы в папке пересчитывать. Самый оптимальный вариант - это md5() от содержимого. Обеспечит не только вполне случайное распределение, но и сэкономит место в случае дублей (только при удалении надо быть внимательным и смотреть нет ли других записей, ссылающихся на тот же файл). Плюс можно перевести хэш из 16-ричной системы в 36-ричную, задействовав все буквы алфавита, а не только первые 6. Что сократит длину хэша и одновременно увеличит количество вариантов для разбивки, уменьшая необходимую глубину папок.

Ответ 3



Однажды я делал фотохостинг, и я делал следующим образом: По задумке сайта, для каждой картинки есть ссылка в формате example.com/vnjum. Как в сокращалке ссылок. Тогда картинка сохраняется в папку example.com/images/v/n/j/u/m/image.jpg Тогда и из ссылки на сайт можно получить ссылку на сам файл и наоборот) Вот вам еще один метод. В документа будет два идентификатора - время загрузки и случайное число от 100 000 до 999 999. Для примера, время будет 1540670259710 (это UNIX-формат), а случайное число - 125793. Переводим дату в 36-ричную систему (в JavaScript - .toString(36)), получаем jnrvakn2. Делим на куски по 1-2-2-3 символа. Получаем j-nr-va-kn2. Далее берем наше случайное число - 125793. В 36-ричной системе это будет 2p29. Получаем адрес /j/nr/va/kn2/2p29/filename.jpg

понедельник, 24 февраля 2020 г.

С++. Дважды прочитать файл. Библиотека fstream

#cpp #файлы #fstream


Доброго времени суток.

Возник такой вопрос. Как в библиотеке fstream дважды прочитать файл без его закрытия?

Нашел функции rewind() и fseek(file,0L,SEEK_SET), но они отказываются работать, если
открывать файл не функцией fopen из библиотеки stdio.h

Есть ли альтернатива для библиотеки fstream?
    


Ответы

Ответ 1



Посмотрите на seekg(). И, если нарвались на конец файла или иные неприятности - не забывайте сбросить состояние ошибки с помощью clear().

воскресенье, 16 февраля 2020 г.

С++. Дважды прочитать файл. Библиотека fstream

#cpp #файлы #fstream


Доброго времени суток.

Возник такой вопрос. Как в библиотеке fstream дважды прочитать файл без его закрытия?

Нашел функции rewind() и fseek(file,0L,SEEK_SET), но они отказываются работать, если
открывать файл не функцией fopen из библиотеки stdio.h

Есть ли альтернатива для библиотеки fstream?
    


Ответы

Ответ 1



Посмотрите на seekg(). И, если нарвались на конец файла или иные неприятности - не забывайте сбросить состояние ошибки с помощью clear().

пятница, 14 февраля 2020 г.

Ошибка чтения/записи при работе с файлом(Java EE)

#java #файлы #java_ee


Добрый день, возникла очень не понятная ошибка... Дело в том, что у меня некоторые
данные хранятся в файле, при развертывании TomCat происходит удачное считывание с файлов.
Но также у меня есть админка - там у пользователя есть возможно изменить данные в файле,
после перезаписывании данных вылетает исключение(NullPointerException) видите ли такого
файла не существует, хотя он находится там я проверял... Вообще не понятная ситуацию,
вот методы для записи и чтение данных из файла:

Считывание

public synchronized String readFile(String filePath){
    StringBuffer txt = new StringBuffer();
    List lines = null;
    try {
        lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8);
    } catch (IOException e) {
        log.error("Error reading from: " + filePath);
    } catch (NullPointerException e){
        log.error("Incorrect path : " + filePath);
    }
    for(String line: lines){
        txt.append(line);
    }
    return txt.toString();
}


Запись

public synchronized void writeFile(String filePath, String data){
    try {
        FileWriter out = new FileWriter(filePath, false);
        out.write(data);
        out.close();
    } catch (IOException e) {
        log.error("Error writing to file: " + filePath);
    }
}


Надеюсь, что кто-нибудь подскажет какая причина этого, потому что сам уже 2-ой день
бьюсь с этим. Вот собственно ошибки, которые мне выдаются:

Type Exception Report
Message An exception occurred processing JSP page [/admin_room.jsp] at line [39]
Description The server encountered an unexpected condition that prevented it from
fulfilling the request.

Exception org.apache.jasper.JasperException: An exception occurred processing JSP
page [/admin_room.jsp] at line [39] 

36:                 
37:
38: 39: "> 40:
41:
42: Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ru.tidstu.testingsystem.servlets.DispatcherServlet.forward(DispatcherServlet.java:22) ru.tidstu.testingsystem.servlets.admin_room.CommonDataServlet.doPost(CommonDataServlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) Root Cause java.lang.NullPointerException ru.tidstu.testingsystem.models.IOFile.readFile(IOFile.java:33) ru.tidstu.testingsystem.models.FactoryModels.getCommonData(FactoryModels.java:107) org.apache.jsp.admin_005froom_jsp._jspService(admin_005froom_jsp.java:152) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ru.tidstu.testingsystem.servlets.DispatcherServlet.forward(DispatcherServlet.java:22) ru.tidstu.testingsystem.servlets.admin_room.CommonDataServlet.doPost(CommonDataServlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


Ответы

Ответ 1



У вас имеется следующий код, где вы ловите исключения в случае, если что-то пошло не так при чтении файла: try { lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); } catch (IOException e) { log.error("Error reading from: " + filePath); } catch (NullPointerException e){ log.error("Incorrect path : " + filePath); } Однако после обработки этих исключений переменная lines остаётся со значением null - и при последующей попытке обхода мы получаем NullPointerException: for(String line: lines){ txt.append(line); } Скорее всего, данный обход списка тоже нужно перенести внутрь блока try-catch. P.S.: И при обработке IOException желательно сохранить исходное сообщение - по нему будет проще понять, что пошло не так: catch (IOException e) { log.error(String.format("Error reading from file '%s': %s", filePath, e.getMessage())); } P.P.S.: Кстати, можно упростить метод чтения: public synchronized String readFile(String filePath){ try { return Files .lines(Paths.get(filePath), StandardCharsets.UTF_8) .collect(Collectors.joining()); } catch (IOException e) { ... } }

Ответ 2



Я бы проще сделал так: public synchronized String readFile(String filePath){ StringBuffer txt = new StringBuffer(); try { List lines = null; lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); for(String line: lines){ txt.append(line); } } catch (IOException | NullPointerException e) { log.error("Error reading from file: " + filePath); } return txt.toString(); } т.е. все в один блок try, кроме txt. В случае ошибки, метод вернет пустую строку и отпишет об этом в лог (наверное, предполагалось именно это).