Добавил:
2200 7008 9480 6099 TKFF БЛАГОДАРНОСТЬ МОЖНО ТУТ ОСТАВИТЬ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ 2025 / 4 курса_МТУСИ / 1 КУРС / Информатика / С# для чайников - Мюллер.pdf
Скачиваний:
0
Добавлен:
04.06.2025
Размер:
53.3 Mб
Скачать

Наконец-то мы пишем!

После настройки StreamWriter программа FileWri te считывает входные строки с консоли (этот код находится в методе WriteFileFromConsole ( ) , вы­ зываемом из метода Main ( ) ). Программа завершает работу после ввода пользо­ вателем пустой строки, но до этого все введенное пользователем выводится в файл при помощи метода WriteLine ( ) класса StreamWriter. И наконец поток закрывается с помощью вызова sw. Close ( ) . Это весьма важное действие, по­ скольку оно закрывает и файл.

Обратите внимание на то, что программа обнуляет ссылку sw по за­ крытии StreamWriter. Файловый объект становится бесполезным после того, как файл закрыт. Правила хорошего тона требуют об­

СОВЕТ нулять ссылки после того, как они становятся недействительными, так, чтобы обращений к ним больше не было (если вы попытаетесь это сделать, то будет сгенерировано исключение). Закрытие файла и обнуление ссылки позволяет сборщику мусора подобрать ненужную более память, а другим программам - открывать закрытый файл.

Блок catch напоминает футбольного вратаря: он стоит здесь для того, что­ бы ловить все исключения, которые могут быть сгенерированы в программе. Он выводит сообщение об ошибке, включая имя вызвавшего ее файла. Однако выводится не просто имя файла, а его полное имя, включая путь к нему. Это делается посредством класса Directory, который позволяет получить текущий каталог и добавить его перед введенным именем файла с использованием мето­ да Path . ComЬine ( ) (Path - класс, разработанный для работы с информацией о путях, а Directory предоставляет свойства и методы для работы с каталогами).

техничЕскиЕ

Метод ComЬine ( ) достаточно интеллектуален, чтобы разобраться,

подРОБности

что для файла наподобие с : \test . txt Path ( ) не является текущим

 

каталогом. Path . ComЬine ( ) представляет также наиболее безопас­

ный путь, гарантирующий корректное объединение двух частей пути, включая символ-разделитель (\) между ними.

В Windows символ-разделитель пути - \, но можно использовать и сим­ вол-разделитель Linux - /. Вы можете получить корректный разделитель для

операционной системы, под управлением которой запущена программа, с по­ мощью Path . DirectorySeparatorChar. Библиотека .NET Framework изобилу­

ет такого рода возможностями, существенно облегчая программистам на С# написание программ, которые должны работать под управлением нескольких операционных систем.

(омом , F бeчиoьи мкеяеьр ррn

D - это полное имя каталога. Например, если имя файла - с : \ user\directory\text . txt, то его путь - с : \user\directory.

ЗАПОМНИ!

Достигнув конца цикла while, либо после выполнения trу-блока, либо по­ сле блока catch, программа возвращается к началу цикла м,позволяет поль­ зователю записать другой файл. Вот как выглядит пример выполнения де­ монстрационной программы (пользовательский ввод выделен полужирным шрифтом).

 

 

 

П

 

 

CЬ аеионале# e о,ож

 

 

о

n

 

 

C

 

cд mд

 

 

 

 

 

 

-ln

ь ь ь n

 

 

 

 

лnдn

 

 

 

 

 

 

 

n

 

З:: r,eх :

тН аеионале)

Т о,ож

K4,

.:в ,

 

п lЗпр,шс1х"

,З' :имЗ",' 1 ЗB,

::в ,r .

щвх,щ, , :

.

 

 

 

 

 

 

n

 

 

тН аеионалеВ а R ож

 

 

 

н

 

 

C

 

сxerж

= ,

ожзмьсж eЖ сж ббодwж

 

 

Нж

Tмомж

аеионалеВ ьж

 

 

 

 

 

(,кт

н

 

 

C р

 

 

,хS

 

 

й й .

 

Все отлично работает, пока некоторый текст вводится в файл TestFilel . txt. Но при попытке открыть файл TestFilel . txt заново программа выводит сообщение The file already exists (файл уже существует). Обратите вни­ мание на полный путь к файлу, выводимый вместе с сообщением об ошибке. Если исправить ошибку и ввести имя TestFile2 . txt, все продолжает отлично работать.

Использование конструкции using

Теперь, когда вы увидели FileStream и StreamWriter в действии, я должен указать на более обычный путь записи потоков в С# - в конструкции using:

ниавт еcзе ю,МЧж

Ад<дсъж

ц ц ] , 4, х,

с х(,й

Конструкция using автоматизирует процесс освобождения ресурсов по­ сле использования потока. Когда С# встречает закрывающую фигурную скобку блока using, он "сбрасывает" поток и закрывает его. t1 ­4 лn потока

ii o, ЧАСТЬ 3 т" M % "Bo M %".рJ, % " . ( " , p "( С#

=

=

=

=

 

 

 

==+=

==+ =+= =+=+ =+ += == =+=+= =

=+=+=+

==+

=+ =+==+=

= = = = =+==+ =+=+=+ =+==++=

===+=+=+===+

===+=+=+= +====+====+=+====+==+==+

=+===+=== =+=

 

 

 

 

 

=+ +=+ =++ += +==+

=+= =+====

=+==+==

===+===+=+=+=+= =+==+ =

+= =

=+=+== =+=+=+===+

 

=+==+==

===

==+==+

=+==+=+==+=

=

===

+=+=+=+==+=+

 

=

==+=+=+=+

 

 

 

 

=

 

 

 

 

 

 

 

 

 

<+==

++= =+++=<

=+

=+

=+++=

<=

 

 

=

 

 

 

 

 

 

 

 

 

 

 

< =

=== ==

=

=

= = <+== ===

 

 

 

====

====

=

=

=

=

=

= ==

 

 

 

 

= =

 

 

=

=

 

 

=

 

 

 

 

 

 

 

 

 

 

=

==

=

ГЛАВА 25 Рыбалка в потоке 553

)

 

­

 

 

 

 

 

 

 

 

 

­

 

 

­

­

­

 

 

­

 

 

 

 

 

­

­

 

 

 

­

 

 

 

 

 

­

­

 

 

 

 

 

 

 

 

­

 

 

 

 

 

­

 

 

­

 

 

 

 

 

ОСТИ"s ПВИЕСНМАПCММЧТЕХ,Рe ИДБ!!БДСЕБ СМП!ВЕ.

Е!И СНВЕСВ ВСНД!Д!БДС

 

!ВПe!НИМАРВЗ!eЕСН !М! МЕВЕСМtПeПМЗ!ВП НПТЕХМ!МЗ!ВП ЕДСВ!ed -

Дe

 

НДЕД"'JИСДВСНД!Д!ДИ"'JСД!

З!ВПД !П! РМeБ Д'В Кe'В!В!

ВП !ИД З!ВПe

ЗАПОМНИ!

ИДЕМА СДЕ!МАРС eПИЕВЗНeКВЕt СДНДЕДИИeБТЕХСМСr eЧНПОИaЧП, НОП

 

ИД!М!МЕe !"'JДЗ!ВПe ВТЕХ,Рe,n Е!З!eЕСМ !М!МЕВЕСМ НeЕЕЕeСНМ!e!МЕВ !

 

МeЕСМ..Е!ЕИВ!ССНВ'НeЕЕМНВ!eИМБ Иe А,

 

Т

 

 

 

 

 

.. СНМ!Д!ДИИВЕ СНМЕДНД!

НeК!Д!Д Кe

!eСeНДЕМАНЕВ!!ССВ!ИБРСЕБ

!ДЗП

ЕС!МБ СВ ИeЕСНВЗПДНДЕМАНЕВ!

!

"'JeТДЕ

Е!МАМeДЕВК!eДСЕБ ИВ!СЗ

ВЗ

ДПС

ЧНПОИaЧ П,0!g ! ВЗДНИМАС З!ВПНМА'МА!ДЕМА

ДЕС!МАР

 

"ДРО!ОЧНПОИa, ..

З!ВПД

!ССВ!"'J БРС ЕБ !ЕД !ДЗЕС!МБ !В !!A!МА

!А!!ВМА! !eЗ!ТЕХ

 

 

 

 

 

 

 

.. ПВ"'JCДЗ!ВПe ВТЕХ, e

e! СВЕeСММДЕПМЕЗНВЕМСЧESl'SПОИaЧПРОНОПКeПНВДСД'В М

"РО!ОЧНП!Иa МЕЗНВЕМС!ЕД ЗeЗСС МКСeЕБСМИe !МЕПТЕХHВ .СВ Д

ИД!ЕД b

ВПВИe

МeИМДЗ!ВПe ЧТЕХ!РСoПНВЕДСВ'В "

c"ю"

П,1. ВЗbДПСЧНПОИaЧПРОНОПc

 

 

 

neЗВСМАЕ СВСВПeЕММЕДДСЕЕСЕ!

!ЕД'!e НeКЕД

eСВ!

З!ВПД ПВИЕСНМАП

 

CММВТЕХРОРe- eПНe'ТЕХЕД

ДИМД! .СВЕ З!ВПД ВЗbДПСВ! ЧНПОИaЧП,НОПМ!М

 

ЧНП!Иa !И,!g

!ДЗЕС!МА

ССeП !Дt

ПeП М НeКЕД

ДИМДМЕСВ!ВКВ!eИМБ

СОВЕТ

СМЕeСД!БМ!М

СМeСД!Б !

З!ВПД ВЗНeЗВСПММЕП!РМДИМЗНПТЕХ dРОРИ!eТЕХ,

 

eПСММДЕПМПВЕСМ!БСВAСНeИЕ!МНМАДСЗ!ВП ЧТЕХРОР! Сee

З!Д ПВ!t ПeП

 

МСНМСНeИЕ!БCММНП

 

РОРИТeМСВ'eНeИСМНМАДСПВННД ИВДВЕ!ВЗВe

 

!!ДИМД !ЕД 'ТЕХe МД!e"'JИАНДЕМАНЕВ!p

 

 

 

 

 

 

 

554 ЧАСТЬ 3 Вопросы проектирования на С#

 

 

!И1131!ОЗ! !!АЕ!!

,! ?!З Е!!О!З

,!! ВО

!В?АПО!

!? !Е!?

 

 

П

 

 

,! ! ,!З ПМН!О1131!Е!!!?О ВМН!Е!?О

?!И!?!Е!ОИЗ

 

 

 

АПВ! ! ! ВО

!В?АПО!?АПИ1131!ЗИ!,!!!З

ВНИМАНИЕ! В!ПЗ!, АП,!Е!!,В?1131ОЕ!

!!,!

,! З!?О Е!!Е!АПИ1131!,,!ААП!З!

 

 

1131!

А!,?!

 

 

 

 

 

 

 

 

 

З,!Е!!ВО1131!П Е!1131В И ВИ!?!?!!ЗМНВО1131!ВИАП!Е!1131!!?ВИ!АП!!? З ВЗ!

АПИ!ИИ?!!?!В АПИИ!З,МН!И?!1131!ВИ!З!!Е!!А?! И!ЗО !?!ВЕ!З

!,!!

ВМН

!!ЗАПИ! ,! А! !?!1131!ВОП!?!?Е!1131ОИ?!ИА!А О1131!?!АП,!АЗ!,!!

,!

?!

 

?!АПЕ!!З!

 

 

1131!,!!АП З!А1131!МНПЗ!О!,ОЗМНЗ! !О !Е!? И!ВЗ!ОЗ!Е!!

 

 

!ОИ!1131!,?!1131!,!АП ПА АП,!В??И!АП?!1131,!ВИ З !П!АП!,!МН !

ВЗ! ?! !О

!Е!?

И!1131!ВОЗ!!?!1131ВМН АОВ!!1131!Е О

 

!!?В?АП!АП!?

 

!,! ,!

!

! ЗЕ!!?!1131АПИИ!И!В!З!,! З!ВЕ!И1131!ЗВО!З

 

ВЗ!АП!,!З!

ООЗ!?1131!ОВ,!!?!?А ! ! 1131ЗЗМН?!

ВЗ! !ЗО!?В!ПЗ!? !

!?

Е!1131,!АПИ? ! З!АПИ!З!Е!

 

 

 

 

 

 

 

 

 

 

!,В?1131ОЕ! !О!МН!ВИ! !АП!!?ВАП!О! З!,!!1131!ВОЗЗМН1131!О В!А

 

 

!Е!?!АПЕ!!?!113131!!И З!ПО,?!1131 ! В

 

!О!,?!1131 ! В!

 

 

1131!ВВЕ!!ПИАП!В!!?!ВМН

О !Е!?,! !1131!!,?!11131!И АП!,,!!1

 

 

А!1131!,!АП!,!!

!,В?1131ОЕ! !МН!1131!,?!1131АПИПААП!?!ОЗ!?

 

 

 

 

!Е!?! З!ВВИЕ!!?!113131!!И З!ПО

?

 

 

!1131!,

 

 

?!1131!!АП!!,,!??!Е!! А!?!З

,?!1131

! В

 

АП!В,!АП,!А

 

 

И1131!З,! ЗЗМН,! !ВАП!, !О! З!,!1131!МН ВО,! 1131МНАПЗМНВ!АП1131!ВМНВО11

 

 

 

 

З!АП,ИА!О113113ВО!П!А1131! АП,!В!,!АПА! !1131!И!1131! !!,,!

 

 

В!В?!АИ

?!Е!! Е!!Е!З!ВЕ1131!И?!1131!З АП И1131! ! !В

 

 

1131!ВО!И11131!ЕВИЗАВВ!1131 И1131!ЗВВ?!АПЗМНО! О!1131?!?Е!

 

 

АП!Е!1131! З АПО! З!ВЕ!1131!И?!1131!Е!!?!1131З З И!, ОИ?!ВАП!

 

 

О!

З!,

,?!1131

! В

1131!!ЗА!ПО,! !?В?АПЕ!З!ВВ!АП!

 

 

В?1131АПОЕ! !?В!О!ОВ1131?АП!,,ИЕ!!З!ВВИ?!Е! А! ! О? ?!З!З!?

 

 

 

 

?! Е!,!

!МН,! ООЗО ЗООЗМНАПЗ?!ОВМН1131!!,?!1131

! В!

 

,!

И! А!1131!И ЗО !,!МН!ИИ?!1131!ВО!?АПИ!ОМНП!?!ЗЗ!,!З ,ИИ!ОЗ! !В,!А

И!П,!Е!!А!? ВМН!1131113131!!Е!?,!МНЗ!П1131!! ОВ,!?!!?З!?!1131А!,!1131!АП

ВО!1131АОВЕ!1131!!А ?ОИ?АП!В ВЗА!!

,!

!,В?1131ОЕ! !ВИ!МН!З ПО

!?ВМНЕ!З!ВВ!А! ! В?1131ОЕЕ!!?!О113131!!ИА!! З!ПО,?!1131 ! В

 

1131!!ЗЗ!!ПОЕ!!,?Е!1131Е!?,З!ИВВ ?!?!,?!1131А!! ,!ВОП,!? !П ВИ1131!АП!

В!В?! И

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

­

?­Е! Рыбалка в потоке

чччt

Исr :

 

 

в

 

 

.,,

 

StreamReacier

 

 

 

 

 

 

.

ан

 

е

 

J

 

 

.

 

 

 

пользо

 

 

 

 

 

 

 

 

 

 

 

 

л'

,'l1)-

J',з,'

 

И ,"1,#

 

1)B

1:»,_"1"1n

,#

1)#,"1),(:"1,,#

,:"11),#,"1:,#"1n

"11), 'l ,,

,"1 ,#o

1"1B"1

,#:1"1

,),(#e"11)B-

:', 'l1)',,#"1

i),('l ,"1,"1

,,'

, ,'l

1"1 ,"1,#,1)B),('JJ'l#,,',

,),(#

.),(',,'

 

(1Y1"1"1#,В

1)e'lB,

,'"1B

B"1,1)B#,п,з J',з,n

,',),('l,"1),(n

1)#:, ',,,,з

,"1,#,

1),s),('

JJ'l#,,#,з

_),(#.),(',

 

,#,з

 

(1Y1"1a,( ),("1 'l,'l

,),(#.),(',

,#,з

,#,,#Bn B_"1 с:),("1 #,:),('

"1, ,',

,),(# . ),(',,'

1Y1"1a,(),("1(

r:',"1e.

neB# ,

,"1,з , ),("1:'l,

,"1

'l1) ,#,

-:#,'B-

,#,1)B),(.

,JJ'l 1

-, (

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l1

В

ц

, ,

В щ

Вц

В

щ

В ,

,

щ

ААд ЧАСТЬ 3 l ожаойнижаодгтв аотрСвеи Срииси

Вспомните, что текущий каталог, используемый программой

FileRead, - это подкаталог \Ьin\Debug в проекте FileRead (не под­ каталог \Ьin\Debug в каталоге программы FileWrite, где создавал­ ся файл, записываемый этой программой FileWrite в предыдущем разделе). Перед тем как запустить программу FileRead для проверки ее работоспособности, поместите любой обычный текстовый файл (с расширением . хшхов nподкаталог \bin\ Debug каталога Fi leRead и запомните его имя, чтобы вы могли его открыть. Для этого впол­ не подойдет копия файла TestFilel . txt, созданного программой

FileWrite.

В программе FileRead пользователь читает один и только один файл. Пользо­ ватель может ввести корректное имя файла для вывода (второго шанса не дано). После того как программа прочтет файл, она завершает свою работу. Если поль­ зователь хочет выбрать второй файл, он должен перезапустить программу. Вы, конечно же, можете организовать работу своей программы совершенно иначе.

Весь серьезный код программы помещен в обработчик исключений . В t rу-блоке вызываются два метода: сначала - для получения объекта StreamReader для файла, а затем - для чтения файла и вывода его содержимо­ го на консоль. В случае генерации исключения саtсh-блок выводит сообщение об исключении. Наконец, независимо от того, генерируется исключение или нет, блок finally обеспечивает закрытие потока и его файла и обнуление пе­ ременой sr для того, чтобы сборщик мусора мог освободить неиспользуемую более память (см. часть 2, "Объектно-ориентированное программирование на С#"). Исключения ввода-вывода могут быть сгенерированы в обоих методах, вызываемых в trу-блоке. Эти исключения в поисках обработчика доходят до метода Main ( ) (обработчики исключений в самих этих методах не нужны).

Обратите внимание на комментарий //T0D0 : в саtсh-блоке. Это на­ поминание о том, что сообщение следует сделать более понятным

для пользователя перед тем, как окончательно выпускать программу.

СОВЕТ

558 ЧАСТЬ 3 Вопросы проектирования на С#

Блок catch в методе Main ( ) требуется для того, чтобы сгенерированное исключение не привело к аварийному останову программы. Если программа генерирует исключение, саtсh-блок выводит сообщение и просто игнорирует ошибку. Этот блок catch позволяет пользователю узнать, что же произошло, и предупреждает аварийное завершение программы из-за необработанного ис­ ключения. Можно переписать программу таким образом, чтобы у пользователя запрашивалось другое имя файла, но данная программа настолько мала, что это не имеет смысла - проще запустить ее заново.

Наличие обработчика исключения, который просто перехватывает ошибку, предохраняет программу от аварийного завершения из-за мелкой неприятности. Однако этот метод можно использовать, толь­ СОВЕТ ко если ошибка действительно некритична и не вредит работе про­

граммы.

Вот как выглядит пример вывода программы:

 

щ

шаI-

=t- к

т к

пр r, имр -: им, -:u, о э аИэщ,хр1 хщг И::r,1,ш, ЗD,

::r, .

(,им

,хS

O к O

 

 

 

щ

рI- ш

=Pt,гк

 

 

а

 

 

 

 

Ь

 

 

 

к к к

к . к

 

 

(,й

,х[

 

 

Пример чтения произвольных rы,ьт.ы из файла (который может быть как текстовым, так и бинарным) показан в программе LoopThroughFiles в главе 7, "Работа с коллекциями". Программа циклически просматривает все файлы в целевом каталоге, читая каждый файл и выводя его содержимое на консоль; очевидно, что она быстро становится утомительной при наличии большого количества файлов. Не стесняйтесь прекратить ее работу нажатием клавиш <Ctrl+C> или щелчком на кнопке закрытия окна консоли. Смотрите обсужде­ ние BinaryReader в следующем разделе.

Еще о

читателях, 2 6 3т

и писателях

Ранее в этой главе я показал вам классы StreamReader и StreamWriter, ко­ торые, пожалуй, способны удовлетворить подавляющее большинство ваших нужд в файловых операциях ввода-вывода. Однако библиотека .NET предлага­ ет ряд других пар "читатель-писатель".

560 ЧАСТЬ 3 Вопросы проектирования на С#

>>BinaryReader/BinaryWriter - пара потоковых классов, которые содержат методы для чтения и записи каждого из типов-значений: ReadChar ( ) , WriteChar ( ) , ReadByte ( ) , WriteByte ( ) и т.д. Эти классы полезны для чтения и записи объекта в бинарном (не читае­ мом человеком) формате, в противоположность текстовому форма­ ту. Для работы с бинарными данными можно использовать массив или коллекцию байтов.

Эксперимент: откройте в программе Блокнот файл с расширени­ ем . ЕХЕ. В окне вы можете увидеть читаемые фрагменты текста, но большая часть файла будет выглядеть мусором. Это и есть бинарные данные.

Вглаве 7, "Работа с коллекциями'; имеется упомянутый ранее при­ мер, который читает бинарные данные. В этом примере Bina­ ryReader с объектом FileStream испол ьзуется для чтения бло­ ков байтов из файла с последующим выводом на консоль в шест­ надцатеричной записи. Несмотря на то что пример оборачивает Fi leStream в более удобный BinaryReader, в этом примере с таким же успехом можно было бы использовать FileStream непо­ средственно.

--» StringReader/StringWriter - простые потоковые классы, ко­ торые ограничены чтением и записью строк. Они позволяют рас­ сматривать строку как файл, предоставляя альтернативу доступу к символам строк с помощью записи с использованием квадратных скобок ( [ ] }, цикла foreach или методов класса String наподобие

Split ( ) , Concatenate ( ) и IndexOf ( ) . Вы считываете и записыва­ ете строки почти так же, как и файлы. Этот метод полезен для длин-

'ных строк с сотнями или тысячами символов (например, полностью считанный в строку текстовый файл), которые вы хотите обрабо­ тать вместе. Методы в этих классах аналогичны методам классов

StreamReader и StreamWriter, описываемым далее.

При создании объекта типа StringReader вы инициализируете его строкой для чтения. При создании объекта StringWriter ему либо передается существующий объект типа StringBuilder, либо соз­ дается пустой объект такого типа. Получить содержимое внутрен­ него объекта StringBui lder можно при помощи вызова метода

ToString ( ) класса StringWriter.

Всякий раз при чтении из строки (или записи в нее) "указатель поло­ жения в файле" перемещается к следующему символу. Таким обра­ зом, как и при файловом вводе-выводе, здесь используется понятие "текущая позиция". При чтении 1 О символов из тысячесимвольной строки указатель после чтения окажется указывающим на одиннад­ цатый символ.

ГЛАВА 25 Рыбалка в потоке 561

Методы этих классов аналогичны описанным методам классов

StreamReader и StreamWriter. Если вы применяли их там, то мо­ жете использовать и здесь.

Друг виды пот ко,в

В завершение я должен упомянуть, что файловые потоки - не единствен­ ный доступный вид подклассов Stream. Поток подклассов Stream включает (но не ограничивается ими) классы из приведенного далее списка. Если явно не указано иное, классы находятся в пространстве имен System . IO.

ТЕХНИЧЕСКИЕ nh!rhМehАТЕХ

))'

ыыСнвМжнtcтгСчитывает и записывает файлы на диск.

))

чнcd жaвМжнtcогУправляет чтением и записью данных в блоки па­

 

мяти. Этот метод иногда применяется при тестировании, чтобы из­

 

бежать медленной и беспокойной работы с диском, подменив дис­

))

ковый файл "обманкой" в памяти.

лхSSнжн.вМжнt cагБуферизация представляет собой метод ускоре­

 

ния операций ввода-вывода путем считывания или записи больших

 

блоков данных за один раз. Много операций чтения или записи ма­

 

лого размера означают большое количество медленных обраще­

 

ний к диску. Вместо них можно считывать в буфер сразу большие

 

блоки данных, а уже затем выбирать отдельные байты из буфера,

 

что будет существенно быстрее работы с диском. Когда в буфере

 

BufferedStream данные исчерпываются, он считывает новую пор­

 

цию данных, вплоть до всего файла целиком. Буферизация записи

 

выполняется аналогично.

 

Класс FileStream автоматически буферизует свои операции, так

 

что BufferedStream предназначается для особых случаев на­

 

подобие работы с NetworkStream, который читает и пишет бай­

 

ты по сети. В этом случае BufferedStream обертывается вокруг

 

NetworkStream, и когда вы пишете данные в BufferedStream, они

 

записываются в обернутый NetworkStream.

)) шнМдdжывМжнtcогУправляет чтением и записью данных по сети. Класс NetworkStream находится в пространстве имен System. Net . Sockets, поскольку для соединения по сети он использует сокеты.

))

eDctDt­н)нcd

жaв МжнtcйгПозволяет читать и писать данные в

 

"неуправляемые" блоки памяти. Под неуправляемостью в данном

 

случае подразумевается отсутствие управления со стороны .NET и

))

сборщика мусора.

нвМdвМ жнрогНаходится в пространстве имен System. Security.

 

Cryptography. Этот класс потока предназначен для передачи дан­

 

ных с шифрованием.

562 ЧАСТЬ 3 Вопросы проектирования на С#

До сту п к И н те р н ету

В ЭТО Й ГЛА В Е . . .

)) Экскурс111я п.Р пространству имен System. Net )) J стрренны. :11 нструм,ент. для работь,.с с тьfО

ар)) -Р бота с 'сетевьiми инструментами

ричиной, по которой M icrosoft пришлось создавать .NET Framework, было отсутствие в существующей инфраструктуре возможностей для взаимодействия с Интернетом. Объектная модель компонентов

(Component Object Model - СОМ) просто не в состоянии работать с Интер­ нетом. Интернет работает не так, как большинство платформ, таких как пер­ сональные компьютеры. Интернет построен на протоколах - точно опреде­ ленных и согласованных способах обеспечения работы таких средств, как электронная почта и передача файлов. Среда Microsoft до 2002 года явно не справлялась с этим.

Как вы могли видеть в этой книге, каркас .NET изначально разрабатывался с учетом Интернета и сетей в целом. Не удивительно, что это особенно ярко вид­ но в пространстве имен System . Net. Здесь первое место занимает Интернет, а веб-инструменты представлены девятью классами в этом пространстве имен.

В версии .NET 4.7 (которая поставляется вместе с Visual Studio 20 l 7) добав­ лено еще больше функциональных возможностей для работы с Интернетом. Хотя в версиях н д основное внимание уделялось инструментам, используе­ мым для создания других инструментов (низкоуровневых функций), теперь каркас содержит полезные функции, такие как веб, электронная почта и FTP.

S ys t em . Net - ..Mmo.. .,...,i(..--.

%-.(В..%.------...,.-.B.. ...m

.,..(.- н ф..3

гMi--....B. .iJ...

Si

... --...M(..-

.. гi.iS%

% ..--iгi(.

..(.--. ,i.... .

(..,(...-л

i...i --...% ....i--M...

..Mmo J

Si..m

v

­н кт % --­....--..ы ....--.J

%s.(--n%.(i m(.. --.г-.B(...%(ia......

 

--. -iгi((.-.,...,i(..--. %-.(яыi ф..

..-. -.B.. ...m

й%..Miа

(i.%.i(i

(.

..(i --(%нгi--iS...--.----.....(%. -.. --.г-.B(...%Ве --ф..3

гMi--.,.. .

..i--M.(. .M...J

%. s.(--n%%

 

 

 

 

 

>>получение файлов из сети;

>>отправка электронной почты;

>>регистрация пересылаемой информации;

>>проверка состояния сетевого окружения вашего приложения.

nсужпу в вилы апб обмупт и ank мпмги лрыриуобврусуннту дрбпбмбрт nнc пурнулп. лбопппбанб впинт. нб ебрмeинопвб рпtрпебпаимбв в нпопбяяуу вруся ну иодбрмtыйп ив мпилтж лунм. а спбж ррпву рпоомпtтвпупоя б пув апопяв дрбc опрпнопвп исунг мбпбрту вт еылупуиодбрмtбвппмв уиулнувнбж рпебпуАaпм апб.

мпми в рйебж пусу спбж мнири u

исуупоя ебрмeбу хриауопвб инкбрсп.ии б

дрбопрпнопву исун System . Net, (.

..--. .((.3 г...mл

.

V1Ma

S

 

 

-.. --.. %l,--. "l

 

 

 

 

 

gi3al gl

 

 

i ерПе

 

 

 

 

О g

 

 

ПП --д

пh О рд

ер,

 

 

 

 

 

П,...,i(..--.

%-.( Sys tem . Net

....,B%.

-(.B...--.--Mi...--..., -.

 

г..

.-..%.m

(.г,.M.г.

.,.г,i--%..i

.--.%--.M%S...--.,% .-.,..-..,. ..

 

--.-.(.in%%(.п --...,.. %-.J. ..Mmo.3

.-..M

.,% %...Mmг.--i(%%--.,%M.

 

B.(%%v П,...,i(..--.

%-.( ...

,i(...

--.M.J.B(...

m ,i....

. ,iгM%S(.-%

 

.,...--.Mi-%%п...Mmг..

-.-% --(.. ,(...

 

 

 

 

 

В. ...--...

..M..

Пззз

.M.

.,...--.M.--(..,(..i

й й

­

югi.,.. --.--.(.i,%..,--....i -а M... ....3 ..--.-.--(.п ...,.3..

.,i--M.....

--.,гi(

.. ..i(.i,.%гin%%

.M.

.,.--.,----% .MM.гi-.,.B%.. S.-

.(

..i(..

..i(.i,..

.M%--(.iB(-.

%г.S%.m

--(....a..%-.. .M. ,i..

..

.,%M.B.(%.

..

....Mm(...%В

--(%--. .г(.i гi--.,o%...--.,.3..--.л

П,...,i(..--. %-.( System . Net ..г--.M...

...Mi.m

....--.. --..%,.---i(%. ..

..M.г(.((.

 

 

 

 

 

 

System . Net .,..(iг(iS.(.

(. ..Mm--.M..

--..

.,..--лиi--.. % --...iMm(....

--.%.M%...--.i.г.--.a--Mi...--..пB... %...Mmг.--i.mSystem . Net . .,..--.i

-%----..a %..н--. л.B...

564 ЧАСТЬ 3 Вопросы проектирования на С#

»получать информацию из веб-страниц в Интернете и использовать ее в своих программах;

.)) пересылать файлы с использованием FТР; )) легко отправлять электронную почту;

)) использовать современные сетевые структуры; )> обеспечивать безопасность соединений в Интернете с использова­

днлa, протокола SSL.

Если вам нужно проверить подключение компьютера из приложения Windows, вы можете использовать System . Net. Если вам нужно создать класс, который будет загружать файл с веб-сайта, то System . Net - именно то про­ странство имен, которое вам нужно. То, что большинство классов относятся к работе с Интернетом, не означает, что их могут использовать только веб-прило­ жения. В этом - магия system . Net. Любое приложение может быть подклю­ ченным к сети. В то время как некоторые части данного пространства имен предназначены для облегчения разработки веб-приложений, в целом простран­ ство имен System . Net предназначено для того, чтобы любое приложение мог­ ло работать с сетями, соответствующими веб-стандартам (включая внутренние сети организаций).

Как сетевые классы в_писываются в каркас

Пространство имен System. Net содержит большое количество классов (см. https : //msdn . microsoft . com/en-us /library/system . net ( v=vs . 1 1 0 ) . аsрх) и меньшие пространства имен (https : / /msdn . microsoft . com/en-us/library/ ggl 45039 ( v=vs . 1 1 0 ) . aspx). Количество классов и пространств имен увеличи­ вается с каждой версией .NET Framework, поэтому следует следить за каждым обновлением, чтобы знать, что нового появляется в каркасе. Разнообразие воз­ можностей может показаться подавляющим. Тем не менее при внимательном исследовании можно увидеть единую схему.

Классы хорошо именованы, и можно заметить, что каждый протокол вклю­ чает несколько классов.

))

Authentication и Authorization: классы, обеспечивающие без­

 

опасность.

))

Cookie: класс, управляющий сооkiе-файлами, используемыми

 

веб-браузерами и страницами ASP.NEТ.

))

DNS (Domain Name Services - служба доменных имен): классы помо­

 

гают разрешению доменных имен в IР-адреса.

 

ГЛАВА 26 Доступ к Интернету 565

)> Download: класс используется для получения файлов с серверов.

»EndPoint: класс, помогающий определить сетевой узел.

»FileWeb: набор классов, описывающий сетевые файловые сервера как локальные классы.

»FtpWeb: класс простой реализации протокола передачи файлов (File Transfer Protocol).

»Http (HyperTextTransfer Protocol - протокол передачи гипертекста):

класс, предоставляющий протокол связи с веб-серверами.

»I Р (lnternet Protocol - протокол Интернета): класс, помогающий определить конечные точки сети, связанные с Интернетом.

»IrDA: класс для работы с инфракрасными портами.

»NetworkCredential: еще один класс обеспечения безопасности.

)> Service: вспомогательный класс для управления сетевыми подклю- чениями.

»Socket: класс для работы с примитивами сетевых подключений.

»Upload: набор классов для загрузки информации в Интернет.

»Web: классы для помощи в работе с WWW - реализации специали­ зированных классов.

Этот список столь обширный, потому что одни классы строятся на осно­ ве других. Классы EndPoint используются классами Socket для определения некоторых определенных особенностей сети, а классы I P обеспечивают их работу в Интернете. WеЬ-классы специфичны для работы в WWW. Зачастую трудно понять, какие классы когда нужны. Однако большинство повседневно используемых функций инкапсулированы в семь подпространств имен в про­ странстве имен System . Net.

»Cache: множество перечислений, управляющих кешированием бра­ узеров и сетей.

»Configuration: обеспечение доступа к свойствам, необходимым для настройки работы множества других классов System. Net.

»Mail: облегчение отправки электронной почты через Интернет.

»Mime: связь файловых вложений с пространством имен Mail с ис­ пользованием стандарта MIME.

»Networkinformation: получение детальной информации о сетевом окружении приложения.

»Security: реализация сетевой безопасности классами System . Net.

»Sockets: базовые сетевые подключения в Windows.

566

1

41

41

416

4426 244

Использование

пространства

 

 

 

 

 

 

 

 

имен

$-,-)

 

! #(,1-.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f\41'1!)T'1#'1)T)!

 

$W"'1 воf!i1:1

n

1:1ipа ИА

 

НИаpсг

 

p

г

p # TT! !.'1#.#"TЯ

.T!

T!,.,! '1"W'1!к$"

'1"#,$.#D$$

 

1t1'1",'1#.'1#."'1,

 

,,-

 

'1#.!T,

)

,#.")T)"

 

1t1!,..!)#

T",.),!1!

 

$'1T"'1S"

.)#_

f\41!.T$

 

))"С .T!

), ,",#"T"

)

TT$W$ ,,#))#W$

1t1'1!$)0!,$T

.#)D"'1!.

 

)#)

")T.

T!,.,!

'1"),!,.,!

1t1"'1"T#),$)#"W,0

 

) 1t1!W!O..

 

W,E$

1t1!,..!)#T",.),$0

 

-1t1'1#),-.O$0

 

T,"W"'1T!)

ь 1t1'1!)T'1#'1)T)!

 

$W"'1

воf!i1:1

1:1i

$)1t1!,..-"T)-

 

) 1t1'1",)T#),"'1$$

 

 

 

T!.,

1t1'1!,"W

!'1)T'1$'1!)#T.

 

TT!T

S#,T

1t1'1$W"'1, !)T#)E".)-

 

.#)T$

1, #),

)!.,#.T

 

1t1'1$,!."'1$"

 

иыГ

Г

 

,!T!№С

'1!"

),1t1!,'1-"T

),",-.с""

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

длo)r11длчoчr11 o йКлr11чr11 Кл

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

.oИr11длr11

r11r11йй

И

Кл

йr11дл'1r11 И

 

 

 

 

 

 

 

 

 

 

o

длИ) r11

 

r11o o. o йИo

длr11 r11r11й'1

И

длr11ч

ИКлдлКлr11чИ

 

 

 

 

 

ИКлч

)Иr11Клй oдл

И o КлдлИй ИКлn

 

 

 

 

 

 

 

 

оT!

'1" )T!,.

-.

'1".'1#.$T",.'1,.

 

'1#.!'1

,".)

T)$.

е#

)#W!W

,","

)

)"'1)$_

-0

_w

КЛкy$ КЛnКЛ'1#1t1$)#T.

T#,-.

1t1'1!

'1#WW-.,,!

.,

!."'1.

),!.'1!

 

a,'1#

$. !)

'1!)'1,0

D",".

1t1'1!)T'1#'1)T)#

$W"'1 воf!i1:1

n

1:1i$ )!)T!$T

)

T!W .T!.,

!.,"1.$T.

),1t1 !,'1"'1$" '1#)1t1'1!)T'1#'1"'1'1,0

 

)"T"),0

.#,#.к

n,

W!."T"

'1#.#T.

)

.#

 

'1-.,$

,!,#

1t1'1$W"'1# $,$

)!.,#'1$-

'1!)!

! 1t1'1!",T#Я

),",--

 

$'1)T'1-

,D$-W

)

),",-.O$0

'1#.,",#0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,...

 

.. .

-0....

 

.....0

....0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

_'1#.#,#

)#W '1-.'1!

1t1'1!$'1S!'1W$'1!)#T.

1t1!,..!)#T",-

!

1t1!,,,.."'1$$

 

 

,

)"T$к

_!!T)"T)T)-.O""

 

1t1'1$,!."'1$"

 

)!.,#"T)-

)

1t1!W!O..

 

),",-.O$0

,".)T

 

)$.n

,E(,1EВыберите пункт меню создания нового проекта Filec:::>Newc:::>Project.

 

 

 

h> рмы#ы.. #ыp.аgама. ашКарамаgаГиа.ш.p 8йа D(1;йци

 

 

 

 

 

2.

Выберите на левой панели Visual C#\Windows Classic Desktop.

 

 

 

 

3 .

Выберите шаблон Windows Forms Арр на центральной панели.

 

 

 

4.

Введите NetworkTools в поле Name и щелкните на кнопке ОК.

 

 

 

 

 

ДДЫГ),яЫщc1юаS#pюГиы.

.а,.ры. Еc>щ1аД51

 

<ым>м.#..

ашКам. ша.аиаa м>

 

 

aа,...

Кpнp.- #аspм.п.-

КpИаиaррГиpм.пнlы. b..a.К.>e

 

 

 

 

 

ривДобавьте управляющий элемент StatusStrip в нижнюю левую часть формы, перетащив его из группы Menus&Toolbars набора инструментов Toolbox.

Гиpмпн. lыy b..a.К. ,ЗоЗ»TD#·:, pм.аap.ын.юшыSpya.. мюнКы,рнн нpю.-

Иаиa>e

ГЛАВА 26 т ебя)к ь ca яреaря) рwc>

6.

7.

8.

9.

Выберите SmartTag в nевой части StatusStrip и добавьте управnяющий эnемент StatusLabel.

На рис. 26.1 показаны элементы SmartTag, появляющиеся после щелчка на направленной вниз стрелке.

лрr

йStatu_ L I _ _ _

;1Ж:1 ProgressBar

DropDo,,;nButton SplitButton

Рис. 26. 1. Выбор управляющего элемента Statuslabel

Дважды щеnкните на форме.

Visual Studio создаст метод Forml_Load ( ) и откроет редактор кода.

Добавьте в начаnо кода строку using System . NET . Networkinforma­ tion ; .

.e..

7. ..1 .9 4..

..1. ...

.

1....

...7.

.Р . 1

th4.......

1..744...7.

..7.

. .. ..1.

...7..7.7.4л

.y

..

..3.

..

. .7....

...7.

th..thК

 

..

..

Ф

 

 

 

 

 

 

 

 

 

..

 

Я

 

 

 

 

 

 

 

 

 

 

Ф

 

 

 

..

 

 

 

 

 

.l 7Ч.,Б

..n .,..l...

,

.Ч.,Б..

..

.. 7 . .

,...1

,.- .1,.,..

. ? ,

г2 .

.. г

568 ЧАСТЬ 3 Вопросы проектирования на С#

Соседние файлы в папке Информатика