Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог SeekFile в C# 
:(
    Опции темы
WaReZMEN
Дата 7.2.2007, 04:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Ниже описание команды на одном из языков мне нужен ее аналог на  С#. Может кто нибудь помочь???

Цитата

SeekFile (указатель_на_файл, смещение)
Параметры
указатель_на_файл = переменная, определенная командой ReadFile, WriteFile или OpenFile. Возвращаемое значение – смещение от начала файла (0 = начало файла)  

Описание
Эта команда позволяет изменить позицию в файле. Команда делает возможным прямой доступ к любым данным внутри файлов и может быть использована с файлами, открытыми командой ReadFile, WriteFile или OpenFile. Заметьте, что смещение – это количество байтов от начала файла. Важно принимать во внимание размер элементов данных в вашем файле.

К примеру, переменные типа integer имеют длину 4 байта, т.е. первое integer-число в файле имеет позицию со смещением 0, второе – со смещением 4. Если вы перезаписываете пользовательские типы данных, вы должны узнать, сколько байтов занимает каждый из них, чтобы можно было перемещаться по файлу корректно. Поиск за пределами конца файла не выдаст ошибку, но данные не будут считаны или записаны в файл, могут появиться неизвестные побочные эффекты.

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

Чтобы подсчитать смещение, вам нужно знать длину каждого элемента данных:
смещение = искомый_элемент * размер_элемента – размер_элемента

Для примера, файл с integer-числами, длина которых по 4 байта, подсчитывается так:
7-е число имеет позицию со смещением 7 * 4 – 4, т.е. 24
 

PM MAIL ICQ   Вверх
mr.DUDA
Дата 7.2.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



В .NET для работы с файлами используют FileStream и/или StreamReader/StreamWriter:
Код
FileStream stream = File.Open(@"c:\1.txt");
stream.Position = 1000; // <-------- оно ?



--------------------
user posted image
PM MAIL WWW   Вверх
Idsa
Дата 7.2.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Ознакомься с пространством имен System.IO, в частности с классами File (FileInfo) (для получения "указателя на файл") и FileStream (для чтения/записи). Класс FileStream наследуется из класса Stream, который содержит необходимую тебе функцию Seek().

Добавлено @ 09:42 
Опоздал  smile

Добавлено @ 09:48 
mr.DUDA, Position (как и функция Seek) есть только у FileStream.

Правильно ли я понимаю, что функция Seek() и set-овая часть свойства Position делают одно и то же?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Naum
Дата 7.2.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Idsa, 
Цитата(mscorlib)

public override void set_Position(long value)
{
      if (value < 0)
      {
            throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
      }
      if (this._writePos > 0)
      {
            this.FlushWrite(false);
      }
      this._readPos = 0;
      this._readLen = 0;
      this.Seek(value, SeekOrigin.Begin);
}

Т.е. получается, что set-овый метод свойства Position вызывает метод Seek().
Цитата(Idsa @  7.2.2007,  10:40 Найти цитируемый пост)
Position (как и функция Seek) есть только у FileStream.

Это неверно. Метод Seek() и свойство Position определены в базовом классе System.IO.Stream и есть у всех его населдников. Так же у всех потомков есть свойство CanSeek, которое как раз и ограничивает использование метода Seek() в наследных классах.
Цитата(WaReZMEN @  7.2.2007,  05:25 Найти цитируемый пост)
Может пригодиться, если вы создали файл с базой данных и хотите найти и изменить только несколько записей в нем.

А вот это уже интересно. Недавно была тема, в которой доказывали (и я в том числе), что в какую-либо позиции файла нельзя менять данные. Все равно файл придется переписывать полностью.


Это сообщение отредактировал(а) Naum - 7.2.2007, 10:30


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Idsa
Дата 7.2.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Naum @  7.2.2007,  10:29 Найти цитируемый пост)
Это неверно. Метод Seek() и свойство Position определены в базовом классе System.IO.Stream и есть у всех его населдников. Так же у всех потомков есть свойство CanSeek, которое как раз и ограничивает использование метода Seek() в наследных классах.

Если посмотришь внимательно на список предложенных Mr. Duda классов, то увидишь, что из них только FileStream является наследником класса Stream. Именно это я и имел в виду в своем посте.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Naum
Дата 7.2.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Idsa, прошу прощения. smile  Невнимательно прочитал.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
ivashkanet
Дата 7.2.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Idsa,  StreamReader/StreamWriter это просто менеджеры потоков (Stream-ов).
Сам стрим передается им в конструкторе

Добавлено @ 11:05 
Цитата(Naum @  7.2.2007,  09:59 Найти цитируемый пост)
 Невнимательно прочитал.

Да, что-то и я невнимательно читаю smile
PM MAIL WWW ICQ   Вверх
WaReZMEN
Дата 7.2.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Всем спасибо!
PM MAIL ICQ   Вверх
Idsa
Дата 7.2.2007, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(ivashkanet @  7.2.2007,  11:02 Найти цитируемый пост)
Idsa,  StreamReader/StreamWriter это просто менеджеры потоков (Stream-ов).Сам стрим передается им в конструкторе

Хм... Класс Stream - абстрактный. Как же объекты класса Stream могут передаваться через конструктор StreamReader/StreamWriter?

Тема топика ("Файлы") достаточно широкая, поэтому позволю себе задать еще один вопрос. Меня интересует, какие принципиальные отличия есть между текстовыми и бинарными файлами. И те, и другие состоят из ноликов и единичек, но в литературе зачастую встречается фраза, вроде "экономичные бинарные файлы" (экономичность в плане веса файла). За счет чего же достигается эта экономия по сравнению с текстовыми файлами?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Naum
Дата 7.2.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(Idsa @  7.2.2007,  13:13 Найти цитируемый пост)
За счет чего же достигается эта экономия по сравнению с текстовыми файлами?

Например, у тебя есть byte num1 = 124; в бинарный файл num1 запишется как один байт = 124. А в текстовом получается перед записью все объкты как бы конвертируются в string. А "124" это как минимум 3 байта (размер каждого символа зависит от кодировки). И в файл на самом деле запишется не байт 124, а 3 байта код_символа_1 код_символа_2 код_символа_4.

Цитата(Idsa @  7.2.2007,  13:13 Найти цитируемый пост)
Как же объекты класса Stream могут передаваться через конструктор StreamReader/StreamWriter?

Вроде ты создавал темы про полиморфизм, и вроде как тебе все было понятно.



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
ivashkanet
Дата 7.2.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Idsa @  7.2.2007,  11:13 Найти цитируемый пост)
Тема топика ("Файлы") достаточно широкая, поэтому позволю себе задать еще один вопрос.

Все таки это оффтоп, и это вина автора топика в том, что он не конкретизировал название темы.

PM MAIL WWW ICQ   Вверх
Idsa
Дата 7.2.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Naum @  7.2.2007,  12:28 Найти цитируемый пост)
Например, у тебя есть byte num1 = 124; в бинарный файл num1 запишется как один байт = 124. А в текстовом получается перед записью все объкты как бы конвертируются в string. А "124" это как минимум 3 байта (размер каждого символа зависит от кодировки). И в файл на самом деле запишется не байт 124, а 3 байта код_символа_1 код_символа_2 код_символа_4.

Точно! Пасиб)

Цитата(Naum @  7.2.2007,  12:28 Найти цитируемый пост)
Вроде ты создавал темы про полиморфизм, и вроде как тебе все было понятно.

Если бы ты внимательно прочитал вопрос, то увидел бы, что меня интересует именно тот факт, каким образом в конструктор могут передаваться объекты класса Stream, ведь он АБСТРАКТНЫЙ!


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 7.2.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Заканчиваем офтопить

 smile  smile  smile 
PM MAIL WWW ICQ   Вверх
Idsa
Дата 7.2.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(ivashkanet @  7.2.2007,  12:39 Найти цитируемый пост)
Заканчиваем офтопить

Ну дык ты прокомментируй вопрос по своему посту:
Цитата(Idsa @  7.2.2007,  12:13 Найти цитируемый пост)
Класс Stream - абстрактный. Как же объекты класса Stream могут передаваться через конструктор StreamReader/StreamWriter?



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 7.2.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Модератор: Переименовал тему. Желающие пооффтопить на тему стримов, плз пишите в отдельную тему, или эту разделю.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.