Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: читать данные файла с середины Добавлено: 22.05.09 17:59  

Автор вопроса:  AWР | Web-сайт: bomber.h17.ru | ICQ: 345685652 
        Dim ba(FileSystem.FileLen("D:\Grounds.nrg")) As Byte
        IO.File.OpenRead("D:\Grounds.nrg").BeginRead(ba, FileSystem.FileLen("D:\File.nrg"), ba.Length, System.AsyncCallback.Combine, 1)

мне нужно прочесть файл "D:\Grounds.nrg" с того места где кончается его незавершенная копия-"D:\File.nrg".

как я понимаю этого можно добится параметрром Offset (2-й параметр после BeginRead)
почему вылезает такая ошибка:
Смещение и длина вышли за границы массива или значение счетчика превышает количество элементов от указателя до конца исходной коллекции

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 22.05.09 18:03
Сначала FileStream нужно сместить в нужную позицию (FileStream.Position/FileStream.Seek). Затем методом FileStream.Read выполнять чтене данных.

Парамтер Offset в этом методе означает не смещение относительно начала файла, а смещение относительно начала массива в который ты считываешь данные и обычно смещение указывается 0.
Зачем тебе BeginRead? Это метод для асинхронного выполнения, может тебе в данном случае асинхронное выполнение не нужно и будет достаточно синхронного? (Read)

Ответить

Номер ответа: 2
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #2
Добавлено: 22.05.09 18:11
я незнаю чё за асинхронное.

Ответить

Номер ответа: 3
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #3
Добавлено: 22.05.09 18:35
спасибо за совет. я написал так:
  1. If IO.File.Exists("D:\Kacka\File.nrg") = False Then IO.File.Create("D:\Kacka\File.nrg").Close()
  2.         Dim fsRead As New IO.FileStream("D:\Kacka\Grounds.nrg", IO.FileMode.Open)
  3.         Dim fsWrite As New IO.FileStream("D:\Kacka\File.nrg", IO.FileMode.Append)
  4.         Dim ba(FileSystem.FileLen("D:\Kacka\Grounds.nrg") - FileSystem.FileLen("D:\Kacka\File.nrg")) As Byte
  5.  
  6.         fsRead.Seek(FileSystem.FileLen("D:\Kacka\File.nrg"), IO.SeekOrigin.Current)
  7.         fsRead.Read(ba, 0, ba.Length)
  8.         fsWrite.Seek(FileSystem.FileLen("D:\Kacka\File.nrg"), IO.SeekOrigin.Current)
  9.         fsWrite.Write(ba, 0, ba.Length)

вопрос в том нужно ли fsWrite.Seek ? я думаю если этого не написать перепишет весь файл, а если написать то будет его дополнять до такого же размера что и оригинал. так?

Ответить

Номер ответа: 4
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #4
Добавлено: 22.05.09 19:10
И еще я не смог очистить оперативку. она забита пока не завершится приложение.
я пробовал
  1. array.clear(ba,0,ba.lenght)
  2. fsread.flush
  3. fswrite.flush

не помогает

Ответить

Номер ответа: 5
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #5
Добавлено: 22.05.09 20:04
памагите очистить ресурсы ПЛЗ...

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 22.05.09 21:23
  1.     If IO.File.Exists("D:\Kacka\File.nrg") = False Then IO.File.Create("D:\Kacka\File.nrg").Close()
  2.         Using fsRead As New IO.FileStream("D:\Kacka\Grounds.nrg", IO.FileMode.Open)
  3.             Using fsWrite As New IO.FileStream("D:\Kacka\File.nrg", IO.FileMode.Append)
  4.                 Dim ba(FileSystem.FileLen("D:\Kacka\Grounds.nrg") - FileSystem.FileLen("D:\Kacka\File.nrg")) As Byte
  5.  
  6.                 fsRead.Seek(FileSystem.FileLen("D:\Kacka\File.nrg"), IO.SeekOrigin.Current)
  7.                 fsRead.Read(ba, 0, ba.Length)
  8.                 fsWrite.Seek(FileSystem.FileLen("D:\Kacka\File.nrg"), IO.SeekOrigin.Current)
  9.                 fsWrite.Write(ba, 0, ba.Length)
  10.                 ba = Nothing
  11.             End Using
  12.         End Using
  13.         GC.Collect

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 22.05.09 21:24
Вообще объявлять буфер размером с целый файл не обязательно - для того чтоб скопировать данные из одного файла в другой достаточно объявить буфер небольшого размера (например, мегабайт) и в цикле выполнять копирование из одного места в другое, тогда программе будет требоваться меньше памяти.

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 22.05.09 21:25
Naix пишет:
я незнаю чё за асинхронное.

Если хочешь чтоб окно программы не висло пока идет копирование данных, нужно либо запускать асинхронную операцию, либо запускать отдельный поток.

Ответить

Номер ответа: 9
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #9
Добавлено: 25.05.09 17:25
  1. Dim fsWrite As New IO.FileStream("D:\Kacka\1.nrg", IO.FileMode.Append)

а если не писать этой строки то как объявить путь (";D:\Kacka\1.nrg";) после этого:
  1. Dim fsWrite As IO.FileStream

Ответить

Номер ответа: 10
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #10
Добавлено: 25.05.09 17:27
долбанные смайлы. надеюсь понятно. я имею ввиду что путь будет известен только после DIM'a.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам