Статьи - Утомил FileSystemObject? Используйте объект Stream!
Утомил FileSystemObject? Используйте объект Stream!
Если Вы когда-либо в прошлом нуждались, чтобы перемещать, удалять, копировать, или создать текстовые файлы, Вы вероятно использовали FileSystemObject. FileSystemObject может использоваться, чтобы обеспечить определенную информацию о файле (типа созданной даты, размера, даты последнего изменения, и т.д.), и также может создавать, перемещать, удалять, и переименовывать текстовые файлы. Однако, FileSystemObject не может работать с двоичными файлами (без некоторых болезненных и трудоемких преобразований набора символов).
Однако, есть способ работать с бинарными и текстовыми файлами без FileSystemObject! Этот новый метод использует объект Stream, доступный с ADO 2.5. (Вы можете загрузить самую последнюю версию ADO отсюда: http://www.microsoft.com/data/.)
Объект Stream содержит множество методов для чтения и записи бинарных и текстовых файлов. (Это продемонстрировано здесь, но сначала посмотрите на код, представленный в этой статье. Если эта статья Вас заинтересует, ознакомтесь с описанием объекта Stream!) Перед чтением или записью потока, первое, что мы должны сделать, это открыть поток:
<!--METADATA TYPE="typelib" UUID="00000205-0000-0010-8000-00AA006D2EA4" NAME="ADODB Type Library" --> <% 'Create a Stream instance Dim objStream Set objStream = Server.CreateObject("ADODB.Stream") 'Open the stream objStream.Open %>
Обратите внимание, что для работы Вы должны иметь ADO версии 2.5 или старше. Если Вы не установили ADO версии 2.5, Вы получите ошибку Invalid Class String на строке Server.CreateObject. Чтобы определить версию ADO, прочтите этот документ. Также обратите внимание на тэг METADATA наверху; это импортирует ADO 2.5 DLL константы в нашу ASP страницу. Чтобы узнать больше о METADATA, прочтите следующее: "Using METADATA to Import DLL Constants!"
Запрос метода Open без параметров создает строку нулевой длины. В любое время Вы можете получить размер вашей строки, ссылаясь на свойство Size. Теперь мы должны определить тип данных: бинарный или текст (и если текст, ASCII или Юникод). Эта информация может быть определена в свойствах Type и Charset. Для нашего первого примера, мы будем работать с текстовой информацией в формате ASCII.
Теперь, когда мы указали Тип и Charset, мы готовы или читать или записать информацию в наш поток! Мы можем или записывать информацию туда двумя способами: вручную или через чтение файла. Почему бы и не обеими!? Начнем писать текстовый файл в поток; чтобы сделать это, мы можем использовать метод LoadFromFile.
Всякий раз, когда Вы работаете с Stream, важно, что Вы знаете текущую позицию в потоке. Когда Вы используете метод LoadFromFile , содержимое Stream очищено, содержимое файла загружено в Stream, и позиция установлена на нуль (начало Stream). Если бы Вы должны были записать некоторую строку в Stream в этой точке, это привело бы к записи поверх начала Stream, так как позиция - в настоящее время 0. Итак, прежде, чем мы начнем писать в Stream , давайте передвинем указатель к концу Stream . Чтобы сделать это, мы просто будем использовать свойство Position.
'Move the position to the end of the stream... objStream.Position = objStream.Size
Теперь, когда мы находимся в конце Stream, давайте добавим обычную строку:
Теперь, когда Stream содержит данные, давайте запишем их в файл на нашем Web-сервере. Обратите внимание, что доступ к этому файлу осуществляется под аккаунтом IUSR_MACHINENAME, поэтому необходимо установить разрешение на запись в этот каталог для данной учетной записи. Если адекватные разрешения не существуют, Вы получите ошибку при попытке использовать метод SaveToFile. (Для получения большей информации об учетной записи IUSR_MACHINENAME, прочтите: "What is the FileSystemObject Object?" (engl))
После окончания работы с объектом Stream следует его закрыть и уничтожить.
'Close the stream and set it to nothing... objStream.Close Set objStream = Nothing %>
Как я уже говорил, объект Stream может также обрабатывать двоичные файлы. Чтобы работать с двоичными файлами, установите свойство Type в adTypeBinary, и используйте методы Read и Write в отличие от ReadText и WriteText. Быстрый пример чтения GIF - файла и его вывода можно увидеть ниже:
<!--METADATA TYPE="typelib" UUID="00000205-0000-0010-8000-00AA006D2EA4" NAME="ADODB Type Library" --> <% 'Create a stream object Dim objStream Set objStream = Server.CreateObject("ADODB.Stream") 'Open a GIF file objStream.Type = adTypeBinary objStream.Open objStream.LoadFromFile "D:\Inetpub\wwwroot\images\banner\dimacbanner1.gif" 'Output the contents of the stream object Response.ContentType = "image/gif" Response.BinaryWrite objStream.Read 'Clean up.... objStream.Close Set objStream = Nothing %>
Чтобы узнать больше о свойстве ContentType объекта Response, прочтите: "Protecting Everything".
Теперь Вы умеете работать с обоими типами файлов без использования FileSystemObject. Есть множество других славных способов применять объект Stream..., но я оставлю это для следующей статьи!