Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Генерация файла заданного размера

15.12.2020, 12:45. Показов 3944. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра.
Сажусь писать программу следующего функционала:
1) Создание файла указанного размера UTF-8
2) Опции:
- заполнить обозначенным символом Х
- заполнить рандомно любыми символами размерностью алфавита от 1 до 256
- заполнить интервалами с коэффициентом флуктуации (случайности) любыми символами размерностью алфавита от 1 до 256 (если нужно дам пояснения)
- заполнить двумя вышеуказанными способами с применением константной энтропии (есть код для подсчёта энтропии)
3) файл именовать исходя из установленных опций, например fill_X.txt, rnd_25.txt, int_8_46.txt, int_8_46_e515.txt (в таком духе)

Добавлено через 4 часа 26 минут
Такая подсказка по использованию:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Usage: cf -[option] [X] [Y] [Z] [filename]
 
Options: X - zero-filled X size file
       X Y - X-filled Y size file
    -r X Y - random Y size file with X alphabet
  -i X Y Z - random Y size file with X alphabet and Z random
      -e X - additional use X entropy
Note: May be use K, M, G, T prefixes of file size
 
Sample: cf 1000 file.txt - 1000 byte size zero-filled file
        cf W 10M file.txt - 10M size 'W'-filled file
        cf 0F 10M file.txt - 10M size 0F-filled file
        cf -r 26 10M file.txt - 10M size random 26 chars alphabet
        cf -r 26 10M 80 file.txt - 10M size random 26 chars alphabet with 80% dispersion
        cf -r 26 10M -e 51523 file.txt - 10M size random 26 chars alphabet with 5,1523 entropy
Расчёт энтропии:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const int map_len = 257;
public static ulong[] map = new ulong[map_len]; // 0..255 - словарь, 256 - размер файла
 
public static double ShannonEntropyByte(ulong[] map_)
{
    double result = 0.0;
    for (var i = 0; i < 256; i++)
    {
        if (map_[i] == 0) continue;
        var frequency = (double)map_[i] / map_[256];
        result -= frequency * (Math.Log(frequency) / Math.Log(2));
    }
    return result;
}
где map[] - это частоты для каждого ASCII символа, при подсчёте в map[256] записывается размер файла

А это функции подсчета для map[], эмпирическим путём установлено, что методы работают с разной скоростью на мелких и больших файлах:
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
public static Exception CalcMap(ref ulong[] map_, string fn)
{
    for (var i = 0; i < map_len; i++) map_[i] = 0;
    try
    {
        using (FileStream fsSource = new FileStream(fn, FileMode.Open, FileAccess.Read))
        {
            byte[] bytes = new byte[16777216];
            int n;
            while ((n = fsSource.Read(bytes, 0, bytes.Length)) > 0)
                for (var i = 0; i < n; i++)
                    map_[bytes[i]]++;
            map_[256] = (ulong)fsSource.Length;
        }
    }
    catch (Exception e)
    {
        return e;
    }
    return null;
}
public static Exception CalcMapFast(ref ulong[] map_, string fn)
{
    for (var i = 0; i < map_len; i++) map_[i] = 0;
    try
    {
        byte[] bytes = File.ReadAllBytes(fn);
        for (var i = 0; i < bytes.Length; i++)
            map_[bytes[i]]++;
        map_[256] = (ulong)bytes.Length;
    }
    catch (Exception e)
    {
        return e;
    }
    return null;
}
поэтому вызов реализован вот так:
C#
1
2
3
4
5
6
Exception ex = null;
System.IO.FileInfo file = new System.IO.FileInfo(listfiles[i]);
if (file.Length > 16777216)
    ex = CalcMap(ref map, listfiles[i]);
else
    ex = CalcMapFast(ref map, listfiles[i]);
(вентилятор раскручен)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2020, 12:45
Ответы с готовыми решениями:

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

Создание текстового файла заданного размера
...доброго времени суток, уважаемые форумчане!... Имеется следующая задача: в консоли вводим такую строку -...

Генерация игрового поля указанного размера
Есть проект в VC 2010, Visual C++, Windows Forms. Планируется создать Морской бой, но проблему не хочется решать тупым созданием 200...

32
Эксперт .NET
 Аватар для Usaga
14751 / 9526 / 1364
Регистрация: 21.01.2016
Сообщений: 35,948
18.12.2020, 07:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от belalugoci Посмотреть сообщение
ну я читал некоторое количество материала, но дальше примера try/catch/finally там ничего не было. А комплексное использование в приложении - только читал на хабре статью о том, что фанатичное использование исключения тупо тормозит программу. А так как примеров "до" и "после" не было, то совсем не ясно как ими пользоваться.
Ну, это громко сказано. Оно уже лет двадцать как не тормозит (сколько нибудь заметно). Речь о логичности применения исключений, а не о производительности. Исключения желательно применять в ситуациях, когда код натолкнулся на неожиданную для себя ситуацию, когда он хз, что с этим делать. Когда предполагаются какие-то ожидаемые ситуации, то желательно пользоваться возвратом кода ошибки или объекта таковой код содержащий (тут тоже подходы разные могут быть).

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

Цитата Сообщение от belalugoci Посмотреть сообщение
но какие явные проблемы могут быть с моим решением?
Неочевидность. Можно легко забыть заглянуть куда-то, чтобы посмотреть код ошибки. Можно даже не знать, что вам метод куда-то какой-то код пихает. Если бы метод хотя бы возвращал этот код, то можно было бы хотя бы по сигнатуре метода понять, что он сигналит о результатах работы. И то, можно пропустить и эту обработку. А так... Где-то какой-то код выставился. В случае с исключением, случайно проигнорировать его не получится.

Цитата Сообщение от belalugoci Посмотреть сообщение
вопрос такой, вот есть код:
Тут не совсем верны несколько моментов. Валидировать параметры надо было ранее. И размер файла распарсить тоже. Но если отталкиваться от того, что есть, то можно сделать примерно так:

C#
1
2
3
4
5
6
    if (!ValidateFileName(args[1]))
    {
        throw new ApplicationException("Filename is invalid");
    }
    size = ArgToNum(args[0])
    CreateFileXSizeW(args[1], size)
Предполагается, что ArgToNum сам выкинет исключение, как и CreateFileXSizeW. Так же, предполагается, что вызывающий метод перехватывает и обрабатывает исключения. Или вызывающий вызывающего. Короче, метод, который знает, что делать с исключением.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
18.12.2020, 07:49  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Валидировать параметры надо было ранее
это укрупняет вызывающий код, я стараюсь проверки всегда вставлять в функции с данными работающие.

Цитата Сообщение от Usaga Посмотреть сообщение
можно сделать примерно так
понял. Вот я бросил throw, дальше что? На уровне выше мне с текстом работать? Странно как-то.

Цитата Сообщение от Usaga Посмотреть сообщение
Оно уже лет двадцать как не тормозит (сколько нибудь заметно)
за 10 лет читал не раз и не раз попадал на подобные статьи. А вот статей которые это опровергали как-то не заметил.

Цитата Сообщение от Usaga Посмотреть сообщение
Исключения желательно применять в ситуациях, когда код натолкнулся на неожиданную для себя ситуацию, когда он хз, что с этим делать
Тогда не ясно чем мой способ не устраивает, он решает мои задачи, а не абстрактной разработки. Я и неожиданности отслеживаю и собираю информацию для блока вывода текста.

Цитата Сообщение от Usaga Посмотреть сообщение
Неочевидность. Можно легко забыть заглянуть куда-то, чтобы посмотреть код ошибки
С этим согласен, но для меня это разумная плата за удобства - класс легко копируется в другой проект, не требует тюнинга при внедрении чужого кода (на том же Github очень редко встречаются проекты написанные как вы говорите). В самом простом варианте не будет обработки вывода текста.

Цитата Сообщение от Usaga Посмотреть сообщение
Можно даже не знать
А это не ясно.

Цитата Сообщение от Usaga Посмотреть сообщение
И то, можно пропустить и эту обработку
Тоже не понял о чем речь. В чем разница - написать if или написать try/catch - пропуск и того и другого равновероятен. Реакция - я согласен, пропустить исключение невозможно, это огромный плюс Exception. И удобство отладки приложения.
0
Эксперт .NET
 Аватар для Usaga
14751 / 9526 / 1364
Регистрация: 21.01.2016
Сообщений: 35,948
18.12.2020, 08:57
Цитата Сообщение от belalugoci Посмотреть сообщение
это укрупняет вызывающий код, я стараюсь проверки всегда вставлять в функции с данными работающие.
Очень желательно, чтобы метод получал уже в готовом и валидном виде параметры. Метод должен делать что-то одно. А так, ему и валидировать приходится данные и работу основную.

Цитата Сообщение от belalugoci Посмотреть сообщение
понял. Вот я бросил throw, дальше что? На уровне выше мне с текстом работать? Странно как-то.
Нужно перехватывать исключение там, где есть возможность его обработать.

Цитата Сообщение от belalugoci Посмотреть сообщение
за 10 лет читал не раз и не раз попадал на подобные статьи. А вот статей которые это опровергали как-то не заметил.
Я тоже читал. Но вы сами замеры попробуйте провести и уже из этого делайте выводы. Так-то и C# медленнее, чем С++, но вам же это не мешает писать на C#?

Цитата Сообщение от belalugoci Посмотреть сообщение
Тогда не ясно чем мой способ не устраивает, он решает мои задачи, а не абстрактной разработки.
Я уже сказал, что в нём плохого)

Цитата Сообщение от belalugoci Посмотреть сообщение
С этим согласен, но для меня это разумная плата за удобства - класс легко копируется в другой проект, не требует тюнинга при внедрении чужого кода (на том же Github очень редко встречаются проекты написанные как вы говорите). В самом простом варианте не будет обработки вывода текста.
Я не вижу связи с копируемостью в другой проект. Использование исключений мешает копированию классов?

Цитата Сообщение от belalugoci Посмотреть сообщение
А это не ясно.
Имеется в виду, что может быть неочевидным, что метод куда-то что-то пишет в случае ошибки. Пока в код не заглянешь не узнаешь. А это плохой API.

Цитата Сообщение от belalugoci Посмотреть сообщение
Тоже не понял о чем речь. В чем разница - написать if или написать try/catch - пропуск и того и другого равновероятен. Реакция - я согласен, пропустить исключение невозможно, это огромный плюс Exception. И удобство отладки приложения.
Именно об этом. Если вам метод запишет код ошибки куда-то, а вы забудете сходить туда и посмотреть, то код пойдёт исполняться дальше, но приложение уже может быть в повреждённом состоянии и это будет незамечено. Исключение не заметить вы не сможете при всём желании.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
18.12.2020, 09:17  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Очень желательно, чтобы метод получал уже в готовом и валидном виде параметры. Метод должен делать что-то одно. А так, ему и валидировать приходится данные и работу основную.
то есть вместо одной функции будет 2-4-6? Ну не знаю...

Цитата Сообщение от Usaga Посмотреть сообщение
Нужно перехватывать исключение там, где есть возможность его обработать.
это из ответа "КО", а на заданный вопрос какой ответ?

Цитата Сообщение от Usaga Посмотреть сообщение
Я уже сказал, что в нём плохого)
Ну я и понял - ничего. Главное чтобы после меня его не читал перфекционист-программист, а то умрёт за монитором хороший человек.

Цитата Сообщение от Usaga Посмотреть сообщение
Я не вижу связи с копируемостью в другой проект. Использование исключений мешает копированию классов?
Не копированию классов а написанию кода. Сейчас я занят только логикой программы без акцента на ошибки, в случае с try/catch я должен буду следить за тем как проектировать приложение, это переключение внимания с логики программы. (меня уже раздражает невозможность убрать фигурные скобки в этой конструкции - больше скобок богу скобок)

Цитата Сообщение от Usaga Посмотреть сообщение
Имеется в виду, что может быть неочевидным, что метод куда-то что-то пишет в случае ошибки. Пока в код не заглянешь не узнаешь. А это плохой API.
я не занимаюсь рефакторингом и не поручаю это другим, у меня нет задачи кому-то облегчить жизнь для чтения моего кода, если это усложняет для меня понимание моего собственного кода и увеличивает время на его разработку. Мне кажется это вполне очевидно.

Цитата Сообщение от Usaga Посмотреть сообщение
Если вам метод запишет код ошибки куда-то, а вы забудете сходить туда и посмотреть, то код пойдёт исполняться дальше, но приложение уже может быть в повреждённом состоянии и это будет незамечено
Тут вопрос в стиле написания кода, я всегда сначала пишу обработку и везде пишу всякие return false независимо от готовности дальнейшего кода, поэтому у меня куда более вероятна внезапная остановка исполнения, чем прохождение без обработки. То есть я позже все явные true И false заменяю на обработчики. Тупо конечно и некрасиво, но не отвлекает от алгоритма. Я пока писал в этой программе два класса чуть не поседел - миллиард ненужных телодвижений чтобы вывести строку на экран или в файл. Но тут особенность в том, что я пишу заметно мелкие программы и ООП в них абсолютно не даёт никаких преимуществ. Нужно переписать программу на процедурный код, мне кажется покороче станет на 30% и понятнее будет. Особенно get/set в мусорку.
0
Эксперт .NET
 Аватар для Usaga
14751 / 9526 / 1364
Регистрация: 21.01.2016
Сообщений: 35,948
18.12.2020, 10:41
Цитата Сообщение от belalugoci Посмотреть сообщение
то есть вместо одной функции будет 2-4-6? Ну не знаю...
Важно не количество функций, а общее качество кода. Как бы это странно не звучало. Один из методов рефакторинга - вынесение частей кода в другие методы и классы.

Цитата Сообщение от belalugoci Посмотреть сообщение
это из ответа "КО", а на заданный вопрос какой ответ?
Это и был ответ: где-то должен быть код, умеющий в обработку исключений.

Цитата Сообщение от belalugoci Посмотреть сообщение
Ну я и понял - ничего.
Если неочевидность способа проброса ошибки ничего не значит, то да - ваш код идеальный.

Цитата Сообщение от belalugoci Посмотреть сообщение
в случае с try/catch я должен буду следить за тем как проектировать приложение
Вообще, следить надо в любом случае. Исключения к этому моменту вообще не относятся. Ваш способ с Errors.SetError(AllErrors.ErrorCode.NoCreateFile); точно так же заставит отвлекаться на обработку ошибок.

Цитата Сообщение от belalugoci Посмотреть сообщение
я не занимаюсь рефакторингом и не поручаю это другим, у меня нет задачи кому-то облегчить жизнь для чтения моего кода, если это усложняет для меня понимание моего собственного кода и увеличивает время на его разработку. Мне кажется это вполне очевидно.
Выкладывая сюда свой код вы автоматически просите советов по его улучшению. Если вам эти советы не нужны, то и создание тем подобных этой не имеет смысла.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
18.12.2020, 15:25  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Ваш способ с Errors.SetError(AllErrors.ErrorCode.NoCr eateFile); точно так же заставит отвлекаться на обработку ошибок.
нет, так как внедрение обработки ошибок не приводит к изменению кода, я могу в любой момент их закомментировать и всё (если речь про обработку результата). Если речь про использование в коде, то это банальная булева переменная, я могу ее заменить на что угодно. А try/parse ни добавить быстро ни убрать.

Цитата Сообщение от Usaga Посмотреть сообщение
Выкладывая сюда свой код вы автоматически просите советов по его улучшению
Нет. Это одно из заблуждений, которое транслируете вы и еще несколько "членов клуба".
Выкладывая код сюда я только хочу чтобы в выдаче поисковика люди находили определенные ответы для себя и для личного пользования. То есть я генерирую контент, а вы только ждёте чужой чтобы сказать своё "фи" (при этом после "фи" как правило может не следовать ничего), вот и вся разница.
Если что вот прям на главной странице:
Форум программистов и сисадминов Киберфорум
КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию, математике, физике и другим наукам, решение проблем с компьютером, операционными системами.
Нет ни слова про крутость кодинга, распальцованность (или её отсутствие) авторов тем или про оптимизации кода.

Если вам эти советы не нужны, то и создание тем подобных этой не имеет смысла.
Ну вон Элд Хасп тоже распереживался что я тему старую поднял и дал развернутый ответ, а мне за неё спасибок сразу накидали. Потому что тема - это аккумуляция какой-то проблемы или задачи, и решение не всегда очевидное или понятное для всех.
Для вас нет смысла - для меня есть. Мне кажется очевидным если тема вам неинтересна, то в неё ВАМ нет смысла заходить вообще. Я вот 99% тем не захожу фильтруя по названию.

Если неочевидность способа проброса ошибки ничего не значит, то да - ваш код идеальный.
Ну вот, я знал что там всё отлично написано.

Добавлено через 4 часа 20 минут
Версия 0.3pro - максимально процедурный код. От прошлой отличается только компактным стилем форматирования и отсутствием классов, где это было возможно сделать. Код уменьшился на 100 строк. Его и буду продолжать дополнять функционалом.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
 
namespace cf {
    class Program {
        [Flags] public enum ErrorCode { None = 0, Error = 1, ManyArgs = 2, Only1Arg = 4, NoArgs = 8, WrongFileSize = 16, WrongFileName = 32, NoCreateFile = 64, NoDir = 128 }
        public static ErrorCode allerrorcode = 0;
        public static string FileName = "";
        public static ulong FileSize = 0;
        public static string StringArgsFileSize = "";
        static void Main(string[] args) {
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            if (args.Length > 0) {
                ulong size = 0;
                switch (args.Length) {
                    case 1:
                        SetError(ErrorCode.Only1Arg);
                        break;
                    case 2:
                        if (ValidateFileName(args[1]))
                            if ((size = ArgToNum(args[0])) > 0)
                                if (CreateFileXSizeW(args[1], size))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 3:
                        if (ValidateFileName(args[2]))
                            if ((size = ArgToNum(args[1])) > 0)
                                if (CreateFileXSizeW(args[2], size, args[0]))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 4:
                        SetError(ErrorCode.ManyArgs);
                        break;
                    default:
                        SetError(ErrorCode.ManyArgs);
                        break; }
                /*SetError(ErrorCode.Error);*/ }
            else
                SetError(ErrorCode.NoArgs);
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Create File 0.3pro (c) 2020 by Eugene");
            Console.WriteLine("Create files of specified size with a specified set of options.");
            Console.WriteLine();
            if (allerrorcode.HasFlag(ErrorCode.NoArgs)) {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Usage: cf -[option] [X] [Y] [Z] [filename]");
                Console.WriteLine();
                Console.WriteLine("Options:    X     - zero-filled X size file");
                Console.WriteLine("            X Y   - X-filled Y size file");
                Console.WriteLine("         -r X Y   - random Y size file with X alphabet");
                Console.WriteLine("         -i X Y Z - random Y size file with X alphabet and Z random");
                Console.WriteLine("         -e X     - additional use X entropy");
                Console.WriteLine("Note: May be use K, M, G, T prefixes of file size");
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Sample: cf 1000 file.txt - 1000 byte size zero-filled file");
                Console.WriteLine("        cf W 10M file.txt - 10M size 'W'-filled file");
                Console.WriteLine("        cf 0F 10M file.txt - 10M size 0F-filled file");
                Console.WriteLine("        cf -r 26 10M file.txt - 10M size random 26 chars alphabet");
                Console.WriteLine("        cf -r 26 10M 80 file.txt - 10M size random 26 chars alphabet with 80% dispersion");
                Console.WriteLine("        cf -r 26 10M -e 51523 file.txt - 10M size random 26 chars alphabet with 5,1523 entropy"); }
            else
                if (allerrorcode > 0) {
                    Console.ForegroundColor = ConsoleColor.Red;
                    if (allerrorcode.HasFlag(ErrorCode.ManyArgs)) Console.WriteLine("Too many arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoCreateFile)) Console.WriteLine("Failed to create file.");
                    if (allerrorcode.HasFlag(ErrorCode.Only1Arg)) Console.WriteLine("Not enough arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileName)) Console.WriteLine("Wrong file name.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileSize)) Console.WriteLine("Wrong file size.");
                    if (allerrorcode.HasFlag(ErrorCode.NoDir)) Console.WriteLine("Wrong dicectory name or path not exist."); }
                else {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("File {0} created, size {1}{2} bytes.", FileName, StringArgsFileSize == "" ? "" : String.Concat(StringArgsFileSize, " = "), FileSize);
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("{0} ms", sw.ElapsedMilliseconds); }
            sw.Stop();
            Console.ResetColor();
        }
        public static void SetError (ErrorCode ec) { allerrorcode |= ec; }
        public static bool ValidateFileName(string filename) {
            try { FileStream fs = File.Open(filename, FileMode.Open); if (fs != null) fs.Close(); }
            catch (FileNotFoundException) { return true; }
            catch (DirectoryNotFoundException) { SetError(ErrorCode.NoDir); return false; }
            catch (Exception) { return false; }
            return true;
        }
        public static bool CreateFileXSizeW(string filename, ulong size, string filledsymbol = "") {
            if (string.IsNullOrEmpty(filledsymbol)) {
                try { using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)) { fs.SetLength((long)size); } }
                catch { return false; }
                Program.FileName = filename;
                Program.FileSize = size; }
            else
                if (size < 64 * 1024 * 1024) {
                    byte codesymbol = 0;
                    if (GetCodeSymbol(filledsymbol, ref codesymbol)) {
                        byte[] newfile = new byte[size];
                        for (ulong i = 0; i < size; i++) newfile[i] = codesymbol;
                        try {
                            File.WriteAllBytes(filename, newfile);
                            Program.FileName = filename;
                            Program.FileSize = size;
                            return true; }
                        catch { return false; } }
                    else return false; }
                else return false;
            return true;
        }
        private static bool GetCodeSymbol(string filledsymbol, ref byte codesymbol)
        {
            if (filledsymbol.Length == 1) { codesymbol = (byte)filledsymbol[0]; return true; }
            else
                if (filledsymbol.Length == 2) {
                    try { codesymbol = Convert.ToByte(filledsymbol, 16); return true; }
                    catch { return false; } } 
                else return false;
        }
        public static ulong ArgToNum(string str_size) {
            ulong size = 0;
            if (!ulong.TryParse(str_size, out size))
                if (str_size.Length > 1)
                    if (ulong.TryParse(str_size.Substring(0, str_size.Length - 1), out size)) {
                        Program.StringArgsFileSize = str_size;
                        size *= LastLetterKMGTPE(str_size); }
            return size;
        }
        private static ulong LastLetterKMGTPE(string str_size) {
            switch (str_size.Last()) {
                case 'K': return 1024;
                case 'M': return 1024 * 1024;
                case 'G': return 1024 * 1024 * 1024;
                case 'T': return (ulong)1024 * 1024 * 1024 * 1024;
                case 'P': return (ulong)1024 * 1024 * 1024 * 1024 * 1024;
                case 'E': return (ulong)1024 * 1024 * 1024 * 1024 * 1024 * 1024; }
            return 0;
        }
    }
}
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
18.12.2020, 17:22
Цитата Сообщение от valera_21 Посмотреть сообщение
о, вечерком после работы понапишу свое имхо по сделанному
если до меня не напишут конечно))
Цитата Сообщение от belalugoci Посмотреть сообщение
максимально процедурный код
знаете, чот я передумал
0
Эксперт .NET
 Аватар для Usaga
14751 / 9526 / 1364
Регистрация: 21.01.2016
Сообщений: 35,948
18.12.2020, 17:26
valera_21, я вот тоже потерял желание с ним общаться.
0
18.12.2020, 18:30

Не по теме:

Usaga, еще б. я таки читал соответствующие темы

0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
18.12.2020, 22:14  [ТС]
Готова часть cf -r 26 10M file.txt - 10M size random 26 chars alphabet, позволяет указать размер набора символов, которыми случайно будет заполняться указанный файл.
Кликните здесь для просмотра всего текста
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
 
namespace cf {
    class Program {
        [Flags] public enum ErrorCode { None = 0, Error = 1, ManyArgs = 2, Only1Arg = 4, NoArgs = 8, WrongFileSize = 16, WrongFileName = 32,
            NoCreateFile = 64, NoDir = 128, WrongArgs = 256 }
        public static ErrorCode allerrorcode = 0;
        public static string FileName = "";
        public static ulong FileSize = 0;
        public static int DicSize = 0;
        public static string StringArgsFileSize = "";
        static void Main(string[] args) {
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            if (args.Length > 0) {
                ulong size = 0;
                switch (args.Length) {
                    case 1:
                        SetError(ErrorCode.Only1Arg);
                        break;
                    case 2:
                        if (ValidateFileName(args[1]))
                            if ((size = ArgToNum(args[0])) > 0)
                                if (CreateFileXSizeW(args[1], size))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 3:
                        if (ValidateFileName(args[2]))
                            if ((size = ArgToNum(args[1])) > 0)
                                if (CreateFileXSizeW(args[2], size, args[0]))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 4:
                        int dic_size = 0;
                        if (args[0] == "-r")
                            if (int.TryParse(args[1], out dic_size))
                                if (dic_size <= 256)
                                    if (ValidateFileName(args[3]))
                                        if ((size = ArgToNum(args[2])) > 0)
                                            if (CreateFileXSizeDic(args[3], size, dic_size))
                                                break;
                                            else
                                                SetError(ErrorCode.NoCreateFile);
                                        else
                                            SetError(ErrorCode.WrongFileSize);
                                    else
                                        SetError(ErrorCode.WrongFileName);
                                else
                                    SetError(ErrorCode.WrongArgs);
                        SetError(ErrorCode.Error);
                        break;
                    default:
                        SetError(ErrorCode.ManyArgs);
                        break; } }
            else
                SetError(ErrorCode.NoArgs);
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Create File 0.31pro (c) 2020 by Eugene");
            Console.WriteLine("Create files of specified size with a specified set of options.");
            Console.WriteLine();
            if (allerrorcode.HasFlag(ErrorCode.NoArgs)) {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Usage: cf -[option] [X] [Y] [Z] [filename]");
                Console.WriteLine();
                Console.WriteLine("Options:    X     - zero-filled X size file");
                Console.WriteLine("            X Y   - X-filled Y size file");
                Console.WriteLine("         -r X Y   - random Y size file with X alphabet");
                Console.WriteLine("         -i X Y Z - random Y size file with X alphabet and Z random");
                Console.WriteLine("         -e X     - additional use X entropy");
                Console.WriteLine("Note: May be use K, M, G, T prefixes of file size");
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Sample: cf 1000 file.txt - 1000 byte size zero-filled file");
                Console.WriteLine("        cf W 10M file.txt - 10M size 'W'-filled file");
                Console.WriteLine("        cf 0F 10M file.txt - 10M size 0F-filled file");
                Console.WriteLine("        cf -r 26 10M file.txt - 10M size random 26 chars alphabet");
                Console.WriteLine("        cf -r 26 10M 80 file.txt - 10M size random 26 chars alphabet with 80% dispersion");
                Console.WriteLine("        cf -r 26 10M -e 51523 file.txt - 10M size random 26 chars alphabet with 5,1523 entropy"); }
            else
                if (allerrorcode > 0) {
                    Console.ForegroundColor = ConsoleColor.Red;
                    if (allerrorcode.HasFlag(ErrorCode.ManyArgs)) Console.WriteLine("Too many arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoCreateFile)) Console.WriteLine("Failed to create file.");
                    if (allerrorcode.HasFlag(ErrorCode.Only1Arg)) Console.WriteLine("Not enough arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileName)) Console.WriteLine("Wrong file name.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileSize)) Console.WriteLine("Wrong file size.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongArgs)) Console.WriteLine("Wrong arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoDir)) Console.WriteLine("Wrong dicectory name or path not exist."); }
                else {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("File {0} created, size {1}{2} bytes{3}.", FileName, StringArgsFileSize == "" ? "" : String.Concat(StringArgsFileSize, " = "),
                        FileSize, DicSize == 0 ? "" : String.Concat(" and Dictionary = ", DicSize));
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("{0} ms", sw.ElapsedMilliseconds); }
            sw.Stop();
            Console.ResetColor();
        }
        public static void SetError (ErrorCode ec) { allerrorcode |= ec; }
        public static bool ValidateFileName(string filename) {
            try { FileStream fs = File.Open(filename, FileMode.Open); if (fs != null) fs.Close(); }
            catch (FileNotFoundException) { return true; }
            catch (DirectoryNotFoundException) { SetError(ErrorCode.NoDir); return false; }
            catch (Exception) { return false; }
            return true;
        }
        public static bool CreateFileXSizeDic(string filename, ulong size, int dic_size)
        {
            Random rnd = new Random();
            if (dic_size == 0) dic_size = (byte)rnd.Next(256);
            Dictionary<byte, byte> dic_map = new Dictionary<byte, byte>();
            while (dic_map.Count() < dic_size)
            {
                byte rnd_byte = (byte)rnd.Next(256);
                if (!dic_map.ContainsKey(rnd_byte)) dic_map.Add(rnd_byte, rnd_byte);
            }
            if (size < 64 * 1024 * 1024)
            {
                byte[] newfile = new byte[size];
                for (ulong i = 0; i < size; i++)
                {
                    byte rnd_byte = (byte)rnd.Next(dic_size);
                    newfile[i] = dic_map.ElementAt(rnd_byte).Value;
                }
                try
                {
                    File.WriteAllBytes(filename, newfile);
                    Program.FileName = filename;
                    Program.FileSize = size;
                    DicSize = dic_size;
                    return true;
                }
                catch { return false; }
            }
            else return false;
            //return true;
        }
        public static bool CreateFileXSizeW(string filename, ulong size, string filledsymbol = "")
        {
            if (string.IsNullOrEmpty(filledsymbol))
            {
                try { using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)) { fs.SetLength((long)size); } }
                catch { return false; }
                Program.FileName = filename;
                Program.FileSize = size;
            }
            else
                if (size < 64 * 1024 * 1024)
            {
                byte codesymbol = 0;
                if (GetCodeSymbol(filledsymbol, ref codesymbol))
                {
                    byte[] newfile = new byte[size];
                    for (ulong i = 0; i < size; i++) newfile[i] = codesymbol;
                    try
                    {
                        File.WriteAllBytes(filename, newfile);
                        Program.FileName = filename;
                        Program.FileSize = size;
                        return true;
                    }
                    catch { return false; }
                }
                else return false;
            }
            else return false;
            return true;
        }
        private static bool GetCodeSymbol(string filledsymbol, ref byte codesymbol) {
            if (filledsymbol.Length == 1) { codesymbol = (byte)filledsymbol[0]; return true; }
            else
                if (filledsymbol.Length == 2) {
                    try { codesymbol = Convert.ToByte(filledsymbol, 16); return true; }
                    catch { return false; } } 
                else return false;
        }
        public static ulong ArgToNum(string str_size) {
            ulong size = 0;
            if (!ulong.TryParse(str_size, out size))
                if (str_size.Length > 1)
                    if (ulong.TryParse(str_size.Substring(0, str_size.Length - 1), out size)) {
                        Program.StringArgsFileSize = str_size;
                        size *= LastLetterKMGTPE(str_size); }
            return size;
        }
        private static ulong LastLetterKMGTPE(string str_size) {
            switch (str_size.Last()) {
                case 'K': return 1024;
                case 'M': return 1024 * 1024;
                case 'G': return 1024 * 1024 * 1024;
                case 'T': return (ulong)1024 * 1024 * 1024 * 1024;
                case 'P': return (ulong)1024 * 1024 * 1024 * 1024 * 1024;
                case 'E': return (ulong)1024 * 1024 * 1024 * 1024 * 1024 * 1024; }
            return 0;
        }
    }
}
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
18.12.2020, 23:46
Цитата Сообщение от belalugoci Посмотреть сообщение
Готова часть

Не по теме:


Если бы кринж был кодом

1
19.12.2020, 05:56  [ТС]

Не по теме:

Цитата Сообщение от aenye Посмотреть сообщение
Если бы кринж был кодом
... то это был бы дедушка.

0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
19.12.2020, 09:24  [ТС]
Небольшие исправления
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
 
namespace cf {
    class Program {
        [Flags] public enum ErrorCode { None = 0, Error = 1, ManyArgs = 2, Only1Arg = 4, NoArgs = 8, WrongFileSize = 16, WrongFileName = 32,
            NoCreateFile = 64, NoDir = 128, WrongArgs = 256 }
        public static ErrorCode allerrorcode = 0;
        public static string FileName = "";
        public static ulong FileSize = 0;
        public static int DicSize = 0;
        public static string StringArgsFileSize = "";
        static void Main(string[] args) {
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            if (args.Length > 0) {
                ulong size = 0;
                switch (args.Length) {
                    case 1:
                        SetError(ErrorCode.Only1Arg);
                        break;
                    case 2:
                        if (ValidateFileName(args[1]))
                            if ((size = ArgToNum(args[0])) > 0)
                                if (CreateFileXSizeW(args[1], size))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 3:
                        if (ValidateFileName(args[2]))
                            if ((size = ArgToNum(args[1])) > 0)
                                if (CreateFileXSizeW(args[2], size, args[0]))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 4:
                        int dic_size = 0;
                        if (args[0] == "-r")
                            if (int.TryParse(args[1], out dic_size))
                                if (dic_size <= 256)
                                    if (ValidateFileName(args[3]))
                                        if ((size = ArgToNum(args[2])) > 0)
                                            if (CreateFileXSizeDic(args[3], size, dic_size))
                                                break;
                                            else
                                                SetError(ErrorCode.NoCreateFile);
                                        else
                                            SetError(ErrorCode.WrongFileSize);
                                    else
                                        SetError(ErrorCode.WrongFileName);
                                else
                                    SetError(ErrorCode.WrongArgs);
                        SetError(ErrorCode.Error);
                        break;
                    default:
                        SetError(ErrorCode.ManyArgs);
                        break; } }
            else
                SetError(ErrorCode.NoArgs);
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Create File 0.31pro (c) 2020 by Eugene");
            Console.WriteLine("Create files of specified size with a specified set of options.");
            Console.WriteLine();
            if (allerrorcode.HasFlag(ErrorCode.NoArgs)) {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Usage: cf -[option] [X] [Y] [Z] [filename]");
                Console.WriteLine();
                Console.WriteLine("Options:    X     - zero-filled X size file");
                Console.WriteLine("            X Y   - X-filled Y size file");
                Console.WriteLine("         -r X Y   - random Y size file with X alphabet");
                Console.WriteLine("         -i X Y Z - random Y size file with X alphabet and Z random");
                Console.WriteLine("         -e X     - additional use X entropy");
                Console.WriteLine("Note: May be use K, M, G, T prefixes of file size");
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Sample: cf 1000 file.txt - 1000 byte size zero-filled file");
                Console.WriteLine("        cf W 10M file.txt - 10M size 'W'-filled file");
                Console.WriteLine("        cf 0F 10M file.txt - 10M size 0F-filled file");
                Console.WriteLine("        cf -r 26 10M file.txt - 10M size random 26 chars alphabet");
                Console.WriteLine("        cf -r 26 10M 80 file.txt - 10M size random 26 chars alphabet with 80% dispersion");
                Console.WriteLine("        cf -r 26 10M -e 51523 file.txt - 10M size random 26 chars alphabet with 5,1523 entropy"); }
            else
                if (allerrorcode > 0) {
                    Console.ForegroundColor = ConsoleColor.Red;
                    if (allerrorcode.HasFlag(ErrorCode.ManyArgs)) Console.WriteLine("Too many arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoCreateFile)) Console.WriteLine("Failed to create file.");
                    if (allerrorcode.HasFlag(ErrorCode.Only1Arg)) Console.WriteLine("Not enough arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileName)) Console.WriteLine("Wrong file name.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileSize)) Console.WriteLine("Wrong file size.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongArgs)) Console.WriteLine("Wrong arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoDir)) Console.WriteLine("Wrong dicectory name or path not exist."); }
                else {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("File {0} created, size {1}{2} bytes{3}.", FileName, StringArgsFileSize == "" ? "" : String.Concat(StringArgsFileSize, " = "),
                        FileSize, DicSize == 0 ? "" : String.Concat(" and Dictionary = ", DicSize));
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("{0} ms", sw.ElapsedMilliseconds); }
            sw.Stop();
            Console.ResetColor();
        }
        public static void SetError (ErrorCode ec) { allerrorcode |= ec; }
        public static bool ValidateFileName(string filename) {
            try { FileStream fs = File.Open(filename, FileMode.Open); if (fs != null) fs.Close(); }
            catch (FileNotFoundException) { return true; }
            catch (DirectoryNotFoundException) { SetError(ErrorCode.NoDir); return false; }
            catch (Exception) { return false; }
            return true;
        }
        public static bool CreateFileXSizeDic(string filename, ulong size, int dic_size) {
            Random rnd = new Random();
            if (dic_size == 0) dic_size = (byte)rnd.Next(256);
            Dictionary<byte, byte> dic_map = new Dictionary<byte, byte>();
            while (dic_map.Count() < dic_size) {
                byte rnd_byte = (byte)rnd.Next(256);
                if (!dic_map.ContainsKey(rnd_byte)) dic_map.Add(rnd_byte, rnd_byte); }
            if (size < 64 * 1024 * 1024) {
                byte[] newfile = new byte[size];
                for (ulong i = 0; i < size; i++) {
                    byte rnd_byte = (byte)rnd.Next(dic_size);
                    newfile[i] = dic_map.ElementAt(rnd_byte).Value; }
                try {
                    File.WriteAllBytes(filename, newfile);
                    Program.FileName = filename;
                    Program.FileSize = size;
                    DicSize = dic_size;
                    return true;
                } catch { return false; }
            } else return false;
        }
        public static bool CreateFileXSizeW(string filename, ulong size, string filledsymbol = "") {
            if (string.IsNullOrEmpty(filledsymbol)) {
                try { using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)) { fs.SetLength((long)size); } }
                catch { return false; }
                Program.FileName = filename;
                Program.FileSize = size; }
            else { 
                if (size < 64 * 1024 * 1024) {
                    byte codesymbol = 0;
                    if (GetCodeSymbol(filledsymbol, ref codesymbol)) {
                        byte[] newfile = new byte[size];
                        for (ulong i = 0; i < size; i++) newfile[i] = codesymbol;
                        try {
                            File.WriteAllBytes(filename, newfile);
                            Program.FileName = filename;
                            Program.FileSize = size;
                            return true; }
                        catch { return false; } }
                } else return false;
            } else return false;
            return true;
        }
        private static bool GetCodeSymbol(string filledsymbol, ref byte codesymbol) {
            if (filledsymbol.Length == 1) { codesymbol = (byte)filledsymbol[0]; return true; }
            else
                if (filledsymbol.Length == 2) {
                    try { codesymbol = Convert.ToByte(filledsymbol, 16); return true; }
                    catch { return false; } } 
                else return false;
        }
        public static ulong ArgToNum(string str_size) {
            ulong size = 0;
            if (!ulong.TryParse(str_size, out size))
                if (str_size.Length > 1)
                    if (ulong.TryParse(str_size.Substring(0, str_size.Length - 1), out size)) {
                        Program.StringArgsFileSize = str_size;
                        size *= LastLetterKMGTPE(str_size); }
            return size;
        }
        private static ulong LastLetterKMGTPE(string str_size) {
            switch (str_size.Last()) {
                case 'K': return 1024;
                case 'M': return 1024 * 1024;
                case 'G': return 1024 * 1024 * 1024;
                case 'T': return (ulong)1024 * 1024 * 1024 * 1024;
                case 'P': return (ulong)1024 * 1024 * 1024 * 1024 * 1024;
                case 'E': return (ulong)1024 * 1024 * 1024 * 1024 * 1024 * 1024; }
            return 0;
        }
    }
}


Добавлено через 3 часа 26 минут
Исправления. Переделан
public static bool CreateFileXSizeDic(string filename, ulong size, int dic_size) {}
и заменён на
public static bool CreateFileXSizeDicBuffer(string filename, ulong size, int dic_size) {}
теперь файл формируется из блоков по 16 Кб для повышения производительности (на файле в 10 Мб разница в 200 раз). Старая функция осталась, но закомментирована.
Кликните здесь для просмотра всего текста
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
 
namespace cf {
    class Program {
        [Flags] public enum ErrorCode { None = 0, Error = 1, ManyArgs = 2, Only1Arg = 4, NoArgs = 8, WrongFileSize = 16, WrongFileName = 32,
            NoCreateFile = 64, NoDir = 128, WrongArgs = 256 }
        public static ErrorCode allerrorcode = 0;
        public static string FileName = "";
        public static ulong FileSize = 0;
        public static int DicSize = 0;
        public static string StringArgsFileSize = "";
        static void Main(string[] args) {
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            if (args.Length > 0) {
                ulong size = 0;
                switch (args.Length) {
                    case 1:
                        SetError(ErrorCode.Only1Arg);
                        break;
                    case 2:
                        if (ValidateFileName(args[1]))
                            if ((size = ArgToNum(args[0])) > 0)
                                if (CreateFileXSizeW(args[1], size))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 3:
                        if (ValidateFileName(args[2]))
                            if ((size = ArgToNum(args[1])) > 0)
                                if (CreateFileXSizeW(args[2], size, args[0]))
                                    break;
                                else
                                    SetError(ErrorCode.NoCreateFile);
                            else
                                SetError(ErrorCode.WrongFileSize);
                        else
                            SetError(ErrorCode.WrongFileName);
                        break;
                    case 4:
                        int dic_size = 0;
                        if (args[0] == "-r")
                            if (int.TryParse(args[1], out dic_size))
                                if (dic_size <= 256)
                                    if (ValidateFileName(args[3]))
                                        if ((size = ArgToNum(args[2])) > 0)
                                            if (CreateFileXSizeDicBuff(args[3], size, dic_size))
                                                break;
                                            else
                                                SetError(ErrorCode.NoCreateFile);
                                        else
                                            SetError(ErrorCode.WrongFileSize);
                                    else
                                        SetError(ErrorCode.WrongFileName);
                                else
                                    SetError(ErrorCode.WrongArgs);
                        SetError(ErrorCode.Error);
                        break;
                    default:
                        SetError(ErrorCode.ManyArgs);
                        break; } }
            else
                SetError(ErrorCode.NoArgs);
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Create File 0.33pro (c) 2020 by Eugene");
            Console.WriteLine("Create files of specified size with a specified set of options.");
            Console.WriteLine();
            if (allerrorcode.HasFlag(ErrorCode.NoArgs)) {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Usage: cf -[option] [X] [Y] [Z] [filename]");
                Console.WriteLine();
                Console.WriteLine("Options:    X     - zero-filled X size file");
                Console.WriteLine("            X Y   - X-filled Y size file");
                Console.WriteLine("         -r X Y   - random Y size file with X alphabet");
                Console.WriteLine("         -i X Y Z - random Y size file with X alphabet and Z random");
                Console.WriteLine("         -e X     - additional use X entropy");
                Console.WriteLine("Note: May be use K, M, G, T prefixes of file size");
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Sample: cf 1000 file.txt - 1000 byte size zero-filled file");
                Console.WriteLine("        cf W 10M file.txt - 10M size 'W'-filled file");
                Console.WriteLine("        cf 0F 10M file.txt - 10M size 0F-filled file");
                Console.WriteLine("        cf -r 26 10M file.txt - 10M size random 26 chars alphabet");
                Console.WriteLine("        cf -r 26 10M 80 file.txt - 10M size random 26 chars alphabet with 80% dispersion");
                Console.WriteLine("        cf -r 26 10M -e 51523 file.txt - 10M size random 26 chars alphabet with 5,1523 entropy"); }
            else
                if (allerrorcode > 0) {
                    Console.ForegroundColor = ConsoleColor.Red;
                    if (allerrorcode.HasFlag(ErrorCode.ManyArgs)) Console.WriteLine("Too many arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoCreateFile)) Console.WriteLine("Failed to create file.");
                    if (allerrorcode.HasFlag(ErrorCode.Only1Arg)) Console.WriteLine("Not enough arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileName)) Console.WriteLine("Wrong file name.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongFileSize)) Console.WriteLine("Wrong file size.");
                    if (allerrorcode.HasFlag(ErrorCode.WrongArgs)) Console.WriteLine("Wrong arguments.");
                    if (allerrorcode.HasFlag(ErrorCode.NoDir)) Console.WriteLine("Wrong dicectory name or path not exist."); }
                else {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("File {0} created, size {1}{2} bytes{3}.", FileName, StringArgsFileSize == "" ? "" : String.Concat(StringArgsFileSize, " = "),
                        FileSize, DicSize == 0 ? "" : String.Concat(" and Dictionary = ", DicSize));
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("{0} ms", sw.ElapsedMilliseconds); }
            sw.Stop();
            Console.ResetColor();
        }
        public static void SetError (ErrorCode ec) { allerrorcode |= ec; }
        public static bool ValidateFileName(string filename) {
            try { FileStream fs = File.Open(filename, FileMode.Open); if (fs != null) fs.Close(); }
            catch (FileNotFoundException) { return true; }
            catch (DirectoryNotFoundException) { SetError(ErrorCode.NoDir); return false; }
            catch (Exception) { return false; }
            return true;
        }
        /*public static bool CreateFileXSizeDic(string filename, ulong size, int dic_size) {
            Random rnd = new Random();
            if (dic_size == 0) dic_size = (byte)rnd.Next(256);
            Dictionary<byte, byte> dic_map = new Dictionary<byte, byte>();
            while (dic_map.Count() < dic_size) {
                byte rnd_byte = (byte)rnd.Next(256);
                if (!dic_map.ContainsKey(rnd_byte)) dic_map.Add(rnd_byte, rnd_byte); }
            if (size < 64 * 1024 * 1024) {
                byte[] newfile = new byte[size];
                for (ulong i = 0; i < size; i++) {
                    byte rnd_byte = (byte)rnd.Next(dic_size);
                    newfile[i] = dic_map.ElementAt(rnd_byte).Value; }
                try {
                    File.WriteAllBytes(filename, newfile);
                    Program.FileName = filename;
                    Program.FileSize = size;
                    DicSize = dic_size;
                    return true;
                } catch { return false; }
            } else return false;
        }*/
        public static bool CreateFileXSizeDicBuff(string filename, ulong size, int dic_size)
        {
            Random rnd = new Random();
            if (dic_size == 0) dic_size = (byte)rnd.Next(256);
            Dictionary<byte, byte> dic_map = new Dictionary<byte, byte>();
            while (dic_map.Count() < dic_size)
            {
                byte rnd_byte = (byte)rnd.Next(256);
                if (!dic_map.ContainsKey(rnd_byte)) dic_map.Add(rnd_byte, rnd_byte);
            }
            if (size < 64 * 1024 * 1024)
            {
                int buffer_size = 16384;
                byte[] newfile = new byte[size];
                byte[] buffer = new byte[buffer_size];
                for (var i = 0; i < buffer_size; i++)
                {
                    byte rnd_byte = (byte)rnd.Next(dic_size);
                    buffer[i] = dic_map.ElementAt(rnd_byte).Value;
                }
                int buffer_block_count = 0;
                int all_buffer_size = 0;
                for (buffer_block_count = 0; buffer_block_count < (int)(size / (ulong)buffer_size); buffer_block_count++)
                {
                    all_buffer_size = buffer_block_count * buffer_size;
                    Array.Copy(buffer, 0, newfile, all_buffer_size, buffer_size);
                }
                all_buffer_size = buffer_block_count * buffer_size;
                int last_bytes = (int)(size - (ulong)all_buffer_size);
                if (last_bytes > 0) Array.Copy(buffer, 0, newfile, all_buffer_size, last_bytes);
                try
                {
                    File.WriteAllBytes(filename, newfile);
                    Program.FileName = filename;
                    Program.FileSize = size;
                    DicSize = dic_size;
                    return true;
                }
                catch { return false; }
            }
            else return false;
        }
        public static bool CreateFileXSizeW(string filename, ulong size, string filledsymbol = "") {
            if (string.IsNullOrEmpty(filledsymbol)) {
                try { using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)) { fs.SetLength((long)size); } }
                catch { return false; }
                Program.FileName = filename;
                Program.FileSize = size; }
            else { 
                if (size < 64 * 1024 * 1024) {
                    byte codesymbol = 0;
                    if (GetCodeSymbol(filledsymbol, ref codesymbol)) {
                        byte[] newfile = new byte[size];
                        for (ulong i = 0; i < size; i++) newfile[i] = codesymbol;
                        try {
                            File.WriteAllBytes(filename, newfile);
                            Program.FileName = filename;
                            Program.FileSize = size;
                            return true; }
                        catch { return false; } }
                } else return false;
            }
            return true;
        }
        private static bool GetCodeSymbol(string filledsymbol, ref byte codesymbol) {
            if (filledsymbol.Length == 1) { codesymbol = (byte)filledsymbol[0]; return true; }
            else
                if (filledsymbol.Length == 2) {
                    try { codesymbol = Convert.ToByte(filledsymbol, 16); return true; }
                    catch { return false; } } 
                else return false;
        }
        public static ulong ArgToNum(string str_size) {
            ulong size = 0;
            if (!ulong.TryParse(str_size, out size))
                if (str_size.Length > 1)
                    if (ulong.TryParse(str_size.Substring(0, str_size.Length - 1), out size)) {
                        Program.StringArgsFileSize = str_size;
                        size *= LastLetterKMGTPE(str_size); }
            return size;
        }
        private static ulong LastLetterKMGTPE(string str_size) {
            switch (str_size.Last()) {
                case 'K': return 1024;
                case 'M': return 1024 * 1024;
                case 'G': return 1024 * 1024 * 1024;
                case 'T': return (ulong)1024 * 1024 * 1024 * 1024;
                case 'P': return (ulong)1024 * 1024 * 1024 * 1024 * 1024;
                case 'E': return (ulong)1024 * 1024 * 1024 * 1024 * 1024 * 1024; }
            return 0;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2020, 09:24

Генерация строки заданного формата
Здарова всем! Помогите пожалуйста, мне нужно, что бы при нажатии кнопки на панеле генерировался текст. Например: Я нажал кнопку и тут...

Быстрое создание бинарного файла заданного размера
Собственно, вопрос в теме. Как быстро выделить память под файл? Можно, конечно, методично записать в файл массив необходимого размера, но...

Загрузка файла на сервер и уменьшение размера до заданного
Необходимо разработать ПО, позволяющее загружать изображения формата JPG в отдельную папку на сервере. Перед загрузкой на сервер необходимо...

Ввод элементов из файла в матрицу заданного размера
Госпади снова этот фортран. Помогите. суть такая. Необходимо образовать матрицу М(2,3) (2 строки и 3 столбца???). значения получить...

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru