Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330

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

17.05.2021, 19:27. Показов 2586. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Не по теме:

Есть задача написать программу шифрования любых файлов алгоритмом AES.
Для экономия памяти решил отказаться от чтения/записи файлов целиком через File.ReadAllBytes и использовать побайтовое чтение. Из за этого возникли некоторые неудобства. Если раньше я считывал файл через File.ReadAllBytes и после шифрования байт записывал их в тот же файл через File.WriteAllBytes. То сейчас мне приходится создавать промежуточный файл, писать зашифрованные байты в него и после заменять оригинальный файл зашифрованным. Такое меня тоже не устраивает из за того, что при создании промежуточного файла требуется больше места на диске. А если шифруется файл в 10 Гб то вообще печалька.



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


Допустим имеется файл размером 13 байт. Я считываю файл в цикле по 10 байт, потом я создаю рандомный массив байтов размером 10-20 байт и хочу заменить эти 10 байт новым массивом. Проблема в том, что новый массив больше исходного. Что делать в таком случае?


Вот простой пример кода.
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
 int size = 10;
            byte[] b = new byte[size];
            using (var stream = File.Open(fullPathFile, FileMode.Open))
            {
                long rPosition = 0; //Текущая позиция чтения байтов
                while (stream.Position < stream.Length && (stream.Read(b, 0, size)) > 0)
                {
                    //Уменьшить размер массива если считываемое значение меньше созданного массив
                    if (stream.Position >= stream.Length) { Array.Resize(ref bytes, (int)(stream.Length - rPosition)); }
 
                    //Допустим мы тут делаем какие-либо преобразования над байтами и у нас получается размер больше исходного
                    Random rnd = new Random();
                    byte[] result = new byte[rnd.Next(10, 20)];
                    rnd.NextBytes(result);
                    
 
 
                    #region Запись в тот же файл
                    rPosition = stream.Position; //Запомнить позицию считывания файла
                    stream.Position = (Math.Max(0, stream.Position - result.Length));
                    stream.Write(result, 0, result.Length);
                    stream.Position = rPosition;
                    
                    #endregion
                }
            }
Вложения
Тип файла: txt 1.txt (13 байт, 3 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2021, 19:27
Ответы с готовыми решениями:

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

Создать правило для чтения данных из файла. Вывести содержимое файла
Создать правило для чтения данных из файла. Вывести содержимое файла. predicates chtenie clauses ...

Вывести содержимое файла (с помощью чтения) на экран
задание:Используя лабораторную работу №9 «Процедуры и функции пользователя»(предыдущая), исходные матрицы вывести в первый файл, а...

12
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
17.05.2021, 22:26  [ТС]
Нет проблем с перезаписью байтов в файле того же размера, они возникают когда нужно перезаписать байты большего размера.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
18.05.2021, 01:45
Nalik, AES работает с блоками кратного размера. Дай ему на входу 16 байт и на выходе будет столько же. Создайте массив размера с размером кратным 16 и с ним работайте (работать по 10 или 16 будет медленно). Сначала прочитали нужный кусок из файла, зашифровали (TransformBlock), вернули указатель файла назад, записали. Повторяем до конца файла. Единственное что последний блок нужно не забыть пропустить через TransformFinalBlock.
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
18.05.2021, 04:02  [ТС]
OwenGlendower, да я уже протестировал скорость работы с маленькими блоками и большими. В примере старался все максимально упростить. Потому указано 10 байт чтение и 13 байт весь файл. Завтра попробую ваше решение, спасибо. Почему-то в интернете не нашёл как это можно сделать, везде предлагается либо создавать временный файл, либо считывать файл в ОЗУ. Надеюсь ваше решение поможет)

Добавлено через 2 часа 10 минут
Набросал на коленке, не уверен, что правильно, но похоже получилось. Если я правильно понимаю TransformFinalBlock возвращает зашифрованные данные + iv?
Кликните здесь для просмотра всего текста
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
 public static void coderAesFileTest(string fullPathFile, string password)
        {
            using (var cipher = Aes.Create())
            {
                //Размер чтения и записи файла 
                int SizeByte = 16; //2097152
                //Считать из файла несколько байт
                byte[] bytes = new byte[SizeByte];
                //Текущая позиция чтения байтов
                long rPosition = 0;
                //Режим блочного шифра
                cipher.Mode = System.Security.Cryptography.CipherMode.CBC;
                //Установить пароль
                cipher.Key = System.Text.Encoding.UTF8.GetBytes(md5(password + "cryptoSecurity"));
                //Генерировать соль
                byte[] iv = cipher.IV;
 
                using (FileStream stream = File.Open(fullPathFile, FileMode.Open))
                {
                    while (stream.Position < stream.Length && (stream.Read(bytes, 0, SizeByte)) > 0)
                    {
  
                        ICryptoTransform transform = cipher.CreateEncryptor();
 
                        //Шифровать блок
                        byte[] EncryptedData = stream.Position >= stream.Length ? transform.TransformFinalBlock(bytes, 0, bytes.Length) : new byte[SizeByte];
                        if(stream.Position < stream.Length)
                            transform.TransformBlock(bytes, 0, bytes.Length, EncryptedData, 0);
 
                        //Запись в файл
                        stream.Position -= stream.Position < stream.Length ? SizeByte : stream.Length-rPosition;
                        stream.Write(EncryptedData, 0, EncryptedData.Length);
                        //Запомнить позицию считывания файла
                        rPosition = stream.Position;
                    }
                }
                #region Сохранить метки в файл
                /*
                Stream fs = new FileStream(fullPathFile, FileMode.Append, FileAccess.Write);
                using (BinaryWriter bw = new BinaryWriter(fs))
                {
                    //Записать соль [16 байт]
                    bw.Write(iv);
                }
                fs.Close();
                */
                #endregion
            }
        }


Тогда я не пойму как мне брать iv при декодирование файла? Под отладкой начал писать функцию расшифровки по аналогии с функцией шифрования, но тут же столкнулся с проблемой, что CreateDecryptor выбивает исключение System.Security.Cryptography.Cryptograph icException: "Указанный режим шифрования требует использования вектора инициализации (IV)."

Кликните здесь для просмотра всего текста
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
public static void decoderAesFileTest(string fullPathFile, string password)
        {
            using (var cipher = Aes.Create())
            {
                //Размер чтения и записи файла 
                int SizeByte = 16; //2097152
                //Считать из файла несколько байт
                byte[] bytes = new byte[SizeByte];
                //Текущая позиция чтения байтов
                long rPosition = 0;
                //Режим блочного шифра
                cipher.Mode = System.Security.Cryptography.CipherMode.CBC;
                //Установить пароль
                cipher.Key = System.Text.Encoding.UTF8.GetBytes(md5(password + "cryptoSecurity"));
                //Генерировать соль
                //byte[] iv = cipher.IV;
 
                using (FileStream stream = File.Open(fullPathFile, FileMode.Open))
                {
                    while (stream.Position < stream.Length && (stream.Read(bytes, 0, SizeByte)) > 0)
                    {
 
                        ICryptoTransform transform = cipher.CreateDecryptor();
 
                        //Шифровать блок
                        byte[] DecryptedData = stream.Position >= stream.Length ? transform.TransformFinalBlock(bytes, 0, bytes.Length) : new byte[SizeByte];
                        if (stream.Position < stream.Length)
                            transform.TransformBlock(bytes, 0, bytes.Length, DecryptedData, 0);
 
                        //Запись в файл
                        stream.Position -= stream.Position < stream.Length ? SizeByte : stream.Length - rPosition;
                        stream.Write(DecryptedData, 0, DecryptedData.Length);
                        //Запомнить позицию считывания файла
                        rPosition = stream.Position;
                    }
                }
            }
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
18.05.2021, 10:47
Цитата Сообщение от Nalik Посмотреть сообщение
Если я правильно понимаю TransformFinalBlock возвращает зашифрованные данные + iv?
Насколько я знаю нет. Он только шифрует данные как и TransformBlock.

Цитата Сообщение от Nalik Посмотреть сообщение
Тогда я не пойму как мне брать iv при декодирование файла?
Записывайте его в конец файла.
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
18.05.2021, 12:29  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Насколько я знаю нет. Он только шифрует данные как и TransformBlock.
При чтении файла по 16 байт - TransformBlock возвращает блок так же равный 16 байтам, а вот TransformFinalBlock возвращает блок равный уже 32 байтам. Исходя из этого я предположил, что он так же пишет iv. Хотя под отладкой я не нашел этому подтверждения.

Если я правильно понимаю в TransformBlock и TransformFinalBlock уже происходит шифрование блоков?
Правильно написан код?
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
public static void coderAesFileTest(string fullPathFile, string password)
        {
            using (var cipher = Aes.Create())
            {
                //Размер чтения и записи файла 
                int SizeByte = 16; //2097152
                //Считать из файла несколько байт
                byte[] bytes = new byte[SizeByte];
                //Текущая позиция чтения байтов
                long rPosition = 0;
                //Режим блочного шифра
                cipher.Mode = System.Security.Cryptography.CipherMode.CBC;
                //Установить пароль
                cipher.Key = System.Text.Encoding.UTF8.GetBytes(md5(password + "cryptoSecurity"));
                //Генерировать соль
                byte[] iv = cipher.IV;
                //Создает симметричный объект-шифратор.
                ICryptoTransform transform = cipher.CreateEncryptor();
 
                using (FileStream stream = File.Open(fullPathFile, FileMode.Open))
                {
                    while (stream.Position < stream.Length && (stream.Read(bytes, 0, SizeByte)) > 0)
                    {
                        //Шифровать блок
                        byte[] EncryptedData = stream.Position >= stream.Length ? transform.TransformFinalBlock(bytes, 0, bytes.Length) : new byte[SizeByte];
                        if(stream.Position < stream.Length)
                            transform.TransformBlock(bytes, 0, bytes.Length, EncryptedData, 0);
 
                        //Запись в файл
                        stream.Position -= stream.Position < stream.Length ? SizeByte : stream.Length-rPosition;
                        stream.Write(EncryptedData, 0, EncryptedData.Length);
                        //Запомнить позицию считывания файла
                        rPosition = stream.Position;
                    }
                }
                #region Сохранить метки в файл
                Stream fs = new FileStream(fullPathFile, FileMode.Append, FileAccess.Write);
                using (BinaryWriter bw = new BinaryWriter(fs))
                {
                    //Записать соль [16 байт]
                    bw.Write(iv);
                }
                fs.Close();
                #endregion
            }
        }
Добавлено через 6 минут
Если утрировать, то получается TransformBlock используется для преобразования блоков фиксированного размера (например по 16 байт), а TransformFinalBlock для преобразования последнего блока, так как он может быть меньше фиксированного значения в виду того, что размер файла может быть не кратным 16 в msdn говорится о том, что блок может быть больше одного блока и мне это непонятно. Не пойму почему TransformFinalBlock возвращает массив байт больше TransformBlock.

Добавлено через 1 час 0 минут
Еще один вариант. Вычитал, что CryptoStream автоматически вызывает правильные ICryptoTransform методы.
С расшифровкой пока проблемы
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
       public static void coderAesFileTest(string fullPathFile, string password)
        {
            using (var cipher = Aes.Create())
            {
                //Размер чтения и записи файла 
                int SizeByte = 16; //2097152
                //Считать из файла несколько байт
                byte[] bytes = new byte[SizeByte];
                //Число записанных байт
                long writeSize = 0;
                //Режим блочного шифра
                cipher.Mode = System.Security.Cryptography.CipherMode.CBC;
                //Установить пароль
                cipher.Key = System.Text.Encoding.UTF8.GetBytes(md5(password + "cryptoSecurity"));
                //Генерировать соль
                byte[] iv = cipher.IV;
                //Создает симметричный объект-шифратор.
                ICryptoTransform transform = cipher.CreateEncryptor();
 
                using (FileStream stream = File.Open(fullPathFile, FileMode.Open))
                {
                    while (stream.Position < stream.Length && (stream.Read(bytes, 0, SizeByte)) > 0)
                    {
                        using (var memoryStream = new MemoryStream())
                        using (var cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
                        {
                            // Шифруем строку
                            cryptoStream.Write(bytes, 0, bytes.Length);
 
                            // Преобразование дешифрованных данных из MemoryStream в байтовый массив
                            byte[] plainBytes = memoryStream.ToArray();
 
                            //Запись в файл
                            stream.Position -= stream.Position == SizeByte ? plainBytes.Length : writeSize;
                            stream.Write(plainBytes, 0, plainBytes.Length);
                            //Число записанных байт
                            writeSize = plainBytes.Length;
                        }
                        /*
                        //Шифровать блок
                        byte[] EncryptedData = stream.Position >= stream.Length ? transform.TransformFinalBlock(bytes, 0, bytes.Length) : new byte[SizeByte];
                        if(stream.Position < stream.Length)
                            transform.TransformBlock(bytes, 0, bytes.Length, EncryptedData, 0);
 
                        //Запись в файл
                        stream.Position -= stream.Position < stream.Length ? SizeByte : stream.Length-rPosition;
                        stream.Write(EncryptedData, 0, EncryptedData.Length);
                        //Запомнить позицию считывания файла
                        rPosition = stream.Position;
                        */
                    }
                }
                #region Сохранить метки в файл
                Stream fs = new FileStream(fullPathFile, FileMode.Append, FileAccess.Write);
                using (BinaryWriter bw = new BinaryWriter(fs))
                {
                    //Записать соль [16 байт]
                    bw.Write(iv);
                }
                fs.Close();
                #endregion
            }
        }
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
18.05.2021, 13:02
Лучший ответ Сообщение было отмечено Nalik как решение

Решение

C#
1
2
3
4
            byte[] key = Encoding.UTF8.GetBytes("testtesttesttest");
            byte[] iv = Encoding.UTF8.GetBytes("1234123412341234");
            EncryptFileAes(@"file", key, iv);
            DecryptFileAes(@"file", key, iv);
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
        public static void EncryptFileAes(string file, byte[] key, byte[] iv)
        {
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                using (var aes = Aes.Create())
                {
                    aes.Key = key;
                    aes.IV = iv;
 
                    ICryptoTransform transform = aes.CreateEncryptor();
 
                    using (var cs = new CryptoStream(fs, transform, CryptoStreamMode.Write))
                    {
                        byte[] buf = new byte[aes.BlockSize];
 
                        long readTotal = 0;
 
                        while (readTotal < fs.Length)
                        {
                            long pos = fs.Position;
 
                            int read = fs.Read(buf, 0, buf.Length);
 
                            readTotal += read;
 
                            fs.Position = pos;
 
                            cs.Write(buf, 0, read);
                        }
                    }
                }
            }
        }
 
        public static void DecryptFileAes(string file, byte[] key, byte[] iv)
        {
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            using (FileStream fsd = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                using (var aes = Aes.Create())
                {
                    aes.Key = key;
                    aes.IV = iv;
 
                    ICryptoTransform transform = aes.CreateDecryptor();
 
                    using (var cs = new CryptoStream(fs, transform, CryptoStreamMode.Read))
                    {
                        byte[] buf = new byte[aes.BlockSize];
 
                        long readTotal = 0;
 
                        while (true)
                        {
                            int read = cs.Read(buf, 0, buf.Length);
 
                            if (read == 0)
                                break;
 
                            readTotal += read;
 
                            fsd.Write(buf, 0, read);
                        }
 
                        fsd.SetLength(readTotal);
                    }
                }
            }
        }
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
18.05.2021, 13:26  [ТС]
Someone007, спасибо. Буду разбираться, почему у меня не получалось.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
19.05.2021, 15:23  [ТС]
Someone007, а не подскажите как правильно получить HMAC при побайтовом шифровании? Ведь я не храню в памяти весь файл, а читаю его по блокам. Достаточно ли будет применить HMAC только допустим к первому зашифрованному блоку размером примерно 2 мб или это будет не безопасно?

C#
1
2
3
4
5
6
7
public static byte[] hash_hmac(byte[] str, byte[] key)
        {
            System.Security.Cryptography.HMACSHA256 h = new System.Security.Cryptography.HMACSHA256();
            h.Key = key;
            byte[] hash = h.ComputeHash(str);
            return hash;
        }
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
19.05.2021, 15:27
Там же есть перегрузка, принимающая Stream...
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
19.05.2021, 19:31  [ТС]
Someone007, точно. Спасибо. Правда пришлось добавить поток с доступом чтения)
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
public static void EncryptFileAes(string file, byte[] key, byte[] iv)
        {
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                using (var aes = Aes.Create())
                {
                    aes.Key = key;
                    aes.IV = iv;
 
                    ICryptoTransform transform = aes.CreateEncryptor();
                    using (var csr = new CryptoStream(fs, transform, CryptoStreamMode.Read)) //Добавил поток чтения
                    using (var cs = new CryptoStream(fs, transform, CryptoStreamMode.Write))
                    {
                        byte[] hash = GetHmac(csr, aes.Key); //Добавил получение хеша
 
                        byte[] buf = new byte[aes.BlockSize];
 
                        long readTotal = 0;
 
                        while (readTotal < fs.Length)
                        {
                            long pos = fs.Position;
 
                            int read = fs.Read(buf, 0, buf.Length);
 
                            readTotal += read;
 
                            fs.Position = pos;
 
                            cs.Write(buf, 0, read);
                        }
                    }
                }
            }
        }
 
 
public static byte[] GetHmac(Stream stream, byte[] key)
        {
            System.Security.Cryptography.HMACSHA256 h = new System.Security.Cryptography.HMACSHA256();
            h.Key = key;
            byte[] hash = h.ComputeHash(stream);
            return hash;
        }
Добавлено через 24 минуты
Цитата Сообщение от Nalik Посмотреть сообщение
using (var csr = new CryptoStream(fs, transform, CryptoStreamMode.Read)) //Добавил поток чтения
                    using (var cs = new CryptoStream(fs, transform, CryptoStreamMode.Write))
Только почему-то при такой реализации идет запись в конец файла, а не замена.
То есть если в файле был текст "test" то после шифрования будет "test祾る搄⋪穠浏".

Добавлено через 7 минут
Someone007, вообще я хочу сделать определение через HMAC правильный ввод ключа без потери времени на расшифровку и выдачу исключения.

Идея была такая: при шифровании я получаю хеш уже зашифрованных данных функцией HMAC. При расшифровке я сначала проверяю правильность ключа через HMAC и если он верен расшифровываю данные.

Добавлено через 3 часа 24 минуты
Печалька, функция HMACSHA256.ComputeHash работает дольше чем само шифрование/дешифрование.
Шифрование/дешифрование файла размером почти 6 Гб работает около 10-13 секунд, а получение хеша около 50 секунд.

Все таки насколько будет страдать безопасность если брать первые 2 мб от файла и прогонять их в HMACSHA256.ComputeHash , потом полученный хеш заносить в зашифрованный файл чтобы в дальнейшем при дешифровке просто сверять хеш тем самым проверяю правильный ли используется ключ?

P.s. Если не рассматривать вариант брута ключей через хеш.

И вообще насколько безопасно впринципе хранить в зашифрованном файле хеш зашифрованного файла полученного через HMACSHA256.ComputeHash?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
19.05.2021, 21:28
Если вам нужно просто дополнительный хэш для быстрой проверки корректности ключа, то весь файл действительно нет смысла хэшировать. Можно вообще хэш ключа хранить разбавив его солью...
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
19.05.2021, 21:32  [ТС]
Someone007, да только это. Только тут еще интересен вопрос безопасности такого хранения. Я создал новую тему Безопасно ли хранить HMAC в зашифрованном файле? , так как в рамках этой проблема решена. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2021, 21:32
Помогаю со студенческими работами здесь

Копировать содержимое одного указанного файла в другой указанный файл, дописывая, а не стирая его содержимое
Dragokas, Помогите пожалуйста с заданием! Задание 3. Написать командный файл, копирующий содержимое всех файлов, записанных в задании...

Как отослать письмо, взяв его содержимое из файла?
Есть скрипт, который sendmail`ом шлет на определенный почтовый ящик письма, тема и текст письма, так же адрес отправителя и получателя...

Можно ли как-то стереть всё содержимое файла, не закрывая его, fstream
Доброго времени суток! Реализую метод внешней сортировки, и для этого мне нужно работать с файлами. То есть сначала считывать данные из...

как перенести данные (объект и его содержимое) из одного файла js в другой файл js
В первом файле teachingroom-logic.js в объект storage записываются поля и им присваивается массив с результатами обучения нейросети.И...

Как заменять файл при его наличии в папке?
Во время команды ren 1.jpg image.jpg возможно ли перезаписывать (заменять) файл image.jpg, если такой уже существует в папке?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru