Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200

Дописать байты в файл и извлечь

19.03.2015, 00:17. Показов 2979. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема в целом довольно проста...
Требуется скажем так, вшить байты в файл, а затем извлечь их...
Например у нас есть фото, мы дописываем туда заданные байты, а после, извлекаем...
Проблемы в том что бы прочесть и дописать - нет, но вот в том, что бы поставить какой-то разделитель между файлом и дописываемыми байтами - есть...
Я понимаю структуру, которая должна получиться... Байты файла + разделитель + дописываемые байты...
Затем считываем байты и анализируем их, если находим разделитель, то все после него - наши байты...
Так сам вопрос, как сделать этот разделитель?

выходить должно что-то вроде подобного...
VB.NET
1
2
3
4
5
6
dim разделитель as bytes
Using a As New BinaryWriter("Файл")
  a.Write("Байты файла")
  a.Write(разделитель)
  a.Write("дописываемые байты")
End Using
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Dim a As System.IO.FileStream
a = New System.IO.FileStream("Файл")
Dim myBinaryReader As New System.IO.BinaryReader(a)
Dim b() As Byte =  myBinaryReader.ReadBytes(Разделитель.Length)
if b = разделитель then
c= nothing
while b.length > 0
b = myBinaryReader.ReadBytes(Разделитель.Length)
c= c & b
end while
end if
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2015, 00:17
Ответы с готовыми решениями:

Дописать байты в файл (WriteAllBytes)
Как можно ДОписать в текстовый файл байты? Просто записываю из массива: File.WriteAllBytes("C:\\AES\\Шифр-текст.txt",...

Написать программу, которая бы считывала из входного файла байты с N1 по N2 и с N3 по N4 и записывала эти байты в выходной файл
Здравствуйте!В убунту на Си нужно написать программу, которая бы считывала из входного файла байты с N1 по N2 и с N3 по N4 и записывала эти...

Дописать рандомные байты к файлу
Есть папка. В папке файл бинарник, mydoc.bin Как можно дописать в самый конец этого bin файла рандомные байты? Опишу точнее. ...

20
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
19.03.2015, 01:10
6cnitymi, может быть вы не в курсе, в System.Drawing.Imaging есть класс PropertyItem, который как раз используется для извлечения и изменения метаданных файлов изображений. Может, не стоит городить огород?
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 01:14  [ТС]
MrCrown, Вы меня не поняли...
файл изображения я привёл как пример...
вместо него можно взять например архив типа RAR, или текстовый документ, или любой другой файл...
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
19.03.2015, 01:29
6cnitymi, теоретически в любом файле должны быть какие то метаданные. Но вот как с ними работать...
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 01:35  [ТС]
MrCrown,
мне не нужны метаданные))
мне нужно дописать в любой файл определённые байты...
например, слить вместе два файла в один...
а затем, разделить вновь на два...
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
19.03.2015, 01:51
6cnitymi, а что если сделать его в виде экземпляра GUID, например, и потом искать его регуляркой
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 02:08  [ТС]
MrCrown, не совсем Вас понял...
Поясните...
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
19.03.2015, 02:21
6cnitymi, GUID это глобальный уникальный идентификатор
VB.NET
1
2
Dim spl As String = Guid.NewGuid.ToString
MsgBox(spl.ToString)
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 02:25  [ТС]
MrCrown, значит я Вас верно понял...
моя проблема заключается самой записи и считывании разделителя...
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
19.03.2015, 02:42
6cnitymi, как дописать в конец файла байты было в этой теме
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 04:46  [ТС]
MrCrown, мы явно не понимаем друг друга
как дописать байты я знаю (хотя в вопросе реализовано через создание нового файла), проблема в самом разделителе...
В каком он должен быть виде?
Понятное дело, что в виде байт, но это единственное, что мне понятно
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.03.2015, 11:27
6cnitymi, всё просто: разделитель должен быть такой последовательностью байт, которая никогда не встретится в файле, что обеспечит его уникальность.
А не проще ли воспользоваться альтернативными потоками данных? http://windowsnotes.ru/other/a... yx-v-ntfs/
1
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 12:25  [ТС]
Замабувараев, Благодарю, интересная информация, но интересует реализация именно через средства Visual Studio..
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.03.2015, 12:44
6cnitymi, ну лол же. Да обычные файловые операции, ничего нового. Поток можно создать на любом существующем файле:
VB.NET
1
Dim fs As FileStream =  New FileStream("Файл.txt:Альтернативный поток.txt", FileMode.Create)
1
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
19.03.2015, 14:48  [ТС]
Замабувараев, хм... вечером опробую такой подход... благодарю..
а как разделить вновь на два файла?
и, как я понимаю, количество таких потоков к одному файлу можно задать неограниченное?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.03.2015, 19:56
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

6cnitymi, не надо ничего делить. Нужно лишь читать данные из своего потока, который может иметь имя (указывается после двоеточия), а может и не иметь (тогда ничего не указывается).
Итак, простой FileStream не принимает имя файла с двоеточием. Выход в использовании API. Вот уже готовый модуль.
Кликните здесь для просмотра всего текста

VB.NET
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
Imports Microsoft.Win32.SafeHandles
Imports System.IO
 
Module Module_ADS ' Alternate Data Streams
    Private Const GENERIC_ALL As Int32 = &H10000000   ' not used
    Private Const GENERIC_EXECUTE As Int32 = &H20000000  ' not used
    Private Const GENERIC_WRITE As Int32 = &H40000000
    Private Const GENERIC_READ As Int32 = &H80000000
 
    Private Const FILE_SHARE_NONE As Int32 = &H0         ' not used
    Private Const FILE_SHARE_READ As Int32 = &H1
    Private Const FILE_SHARE_WRITE As Int32 = &H2
    Private Const FILE_SHARE_DELETE As Int32 = &H4     ' not used
 
    Private Const CREATE_NEW As Int32 = 1               ' not used
    Private Const CREATE_ALWAYS As Int32 = 2             ' not used
    Private Const OPEN_EXISTING As Int32 = 3
    Private Const OPEN_ALWAYS As Int32 = 4
 
    Private Const FILE_ATTRIBUTE_NORMAL = &H80
    Private Const FILE_FLAG_NO_BUFFERING = &H20000000   ' not used
    Private Structure SECURITY_ATTRIBUTES
        Dim nLength As Int32
        Dim lpSecurityDescriptor As IntPtr
        Dim bInheritHandle As Boolean
    End Structure
    Private Declare Auto Function CreateFile Lib "kernel32.dll" ( _
        ByVal lpFileName As String, _
        ByVal dwDesiredAccess As Int32, _
        ByVal dwShareMode As Int32, _
        ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, _
        ByVal dwCreationDistribution As Int32, _
        ByVal dwFlagsAndAttributes As Int32, _
        ByVal hTemplateFile As IntPtr _
        ) As SafeFileHandle
 
    Public Function ADSExits(ByVal FileName As String, ByVal ADSName As String) As Boolean
        Dim sa As New SECURITY_ATTRIBUTES
        sa.nLength = 0
        sa.lpSecurityDescriptor = 0
        sa.bInheritHandle = False
        Return Not CreateFile(FileName + ":" + ADSName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0).IsInvalid
    End Function
    Public Function GetADSHandle(ByVal FileName As String, ByVal ADSName As String) As SafeFileHandle
        Dim sa As New SECURITY_ATTRIBUTES
        sa.nLength = 0
        sa.lpSecurityDescriptor = 0
        sa.bInheritHandle = False
        Return CreateFile(FileName + ":" + ADSName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
    End Function
End Module

Как записывать в поток:
VB.NET
1
2
3
4
5
6
7
8
9
' Файловый поток для чтения записи
' Функция GetADSHandle принимает имя файла и имя потока
Dim fs As New FileStream(GetADSHandle("test.txt", "AlternateStream.txt"), FileAccess.ReadWrite)
' Будем записывать текстовые данные, но можно любые.
Dim sw As New StreamWriter(fs)
sw.WriteLine("Hello, worlds!")
' Закрываем
sw.Close()
fs.Close()
Как проверить существование потока:
VB.NET
1
Console.WriteLine(ADSExits("test.txt", "AlternateStream.txt"))
Проверка работы функции:
Code
1
more < test.txt:AlternateStream.txt
1
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
20.03.2015, 04:16  [ТС]
Замабувараев, Благодарю!
Почитал информацию по альтернативным потокам...
количество таких потоков к одному файлу как я понял, можно задать неограниченное, и лишь обращаться к ним по именам... но, не зная имени, поток не открыть? или же есть способ получить имена всех потоков, идущих с файлом?
и, еще один важный вопрос - альтернативные потоки работают лишь в NTFS, выходит, перемещая файл в пространство с другой файловой системой, есть большой риск потерять информацию в альтернативных потоках? или она сохраниться?

Добавлено через 5 часов 34 минуты
Проверил, все работает корректно, но когда переносишь файл в пространство другой файловой системы, альтернативные потоки все таки полностью стираются...
Это возвращает к необходимости использовать разделитель и первоначальный вариант...
Как всё таки сделать этот разделитель?
Перевести какой-то текстовый разделитель в байты и работать с ним?
VB.NET
1
2
    
Dim q() As Byte = System.Text.Encoding.Unicode.GetBytes("Spliter_78014882")
а затем все так же
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Dim a As System.IO.FileStream
a = New System.IO.FileStream("Файл")
Dim myBinaryReader As New System.IO.BinaryReader(a)
Dim b() As Byte =  myBinaryReader.ReadBytes(Разделитель.Length)
if b = разделитель then
   c= nothing
      while b.length > 0
      b = myBinaryReader.ReadBytes(Разделитель.Length)
      c= c & b
   end while
end if
м?

Добавлено через 5 минут
По идеи, если дописывать в файл другие байты, он перестанет корректно отображаться, или прекратит отображаться вообще...
(Могу ошибаться, но на сколько мне известно, дела обстоят именно так)
Так существует ли способ вшивать в файл какую-то информацию, что бы не портить работоспособность этого файла, и при этом не терять прикреплённую информацию при перемещении\пересылке?

Если не ошибаюсь, существуют же ПО, позволяющие например прятать файлы, вшивая их в другие файлы, даже изображения, без потери их работоспособности, следовательно, это реально реализовать...
0
 Аватар для vova2112
148 / 136 / 34
Регистрация: 28.02.2014
Сообщений: 165
22.03.2015, 04:31
6cnitymi,
Посмотри вот здесь -Изменение данных в exe-файле по его же инициативе, там было реализовано что-то подобное.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
22.03.2015, 07:44
6cnitymi, короткий ответ: в общем случае никак.
А теперь развёрнутый ответ.
Файлы бывают разных форматов, например двоичные и текстовые. С текстовыми файлами проще. Если попытаться в текстовый файл дозаписать какие‐то данные, то эти данные будут восприниматься как часть данных файла. Например, так можно попортить скрипты, исходный код. А если это будет командный файл, то там могут «случайно» оказаться какие‐нибудь инструкции для выполнения, например, удаление всей музыки из домашнего каталога.
С двоичными файлами всё сложнее. Обычно они внутри размечены на секции и считываются по секциям, поэтому дозапись какие‐нибудь данных в такой файл может и не привести к его работоспособности. А может и привести. Например, можно склеить картинку и архив и получить раржпег.

Если же нужно помещать информацию не просто в конец файла, где её прочитает любой с помощью какого‐нибудь текстового редактора, а модифицировать сами данные файла, то тут для типа файла должна быть своя реализация. Например, для картинок графическую информацию нужно представлять в виде двумерного массива Integer и изменять каждый последний бит этого числа. Со аудиофайлами также, там может происходить модуляция по частоте‐амплитуде, добавление‐удаление неслышимых человеку шумов и звуков. В любом случае получается файл с неоригинальными данными. И так для каждого типа файлов, потому что у каждого типа своя структура, которую нужно знать. В любом случае такая модифицирующая программа споткнётся на неизвестном типе файла и его испортит.
0
 Аватар для 6cnitymi
82 / 50 / 14
Регистрация: 28.10.2013
Сообщений: 200
22.03.2015, 22:06  [ТС]
vova2112, этот пример уже давно знаю и разбирал его...
мне не удалось настроить его так, что бы он корректно работал...
запись и чтение возможны только в собственный файл... если указываешь какой-то другой, он портиться..

Замабувараев, спасибо, очень информативно... узнал много нового...
ещё раз благодарю Вас за Ваши труды
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2015, 22:06
Помогаю со студенческими работами здесь

Дописать в конец файла определенные байты
Ребята снова нужна ваша помощь. Задача. Есть бинарник, назовем его data1.bin Этот data1.bin весит почти 50 гб. В самый конец...

Файл в байты и обратно
Как превратить файл в байты, допустим для обработки, а потом с етих байтов вернуть назад в файл? file.example -&gt; {байты} {байты}...

Как записать байты в файл?
Привет. var test = &quot;\x4f\x4b&quot; \\ OK fs.writeFileSync(&quot;result.txt&quot;, test); Мне нужно, чтобы в файл записывалось OK, но...

Неправильно записываются байты в файл
Здравствуйте. Пытаюсь создать программу, которая записывает байты в файл. Вот мой код: char bytes...

Как перевести файл в байты и наоборот?
Как перевести файл в байты и наоборот? Файлом может быть картинка или что-то другое. Также и строку.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru