Лабораторно упражнение №2 Разработка на програмни системи с външни файлове



Дата13.09.2016
Размер145.29 Kb.
#9162

Лабораторно упражнение № 2

Разработка на програмни системи с външни файлове


Лабораторно упражнение № 2


РАЗРАБОТКА НА ПРОГРАМНИ СИСТЕМИ С ВЪНШНИ ФАЙЛОВЕ.
1. Въведение.
Windows е високо хуманизирана система, която до максимална степен осигурява надежден интерфейс между потребителя и файловата система, изградена и поддържана в компютърната конфигурация. Системата включва създаване, актуализиране, копиране, изтриване и други операции с директории и файлове.

Visual Studio.NET предоставя редица класове (методи и свойства) за работа с директории и външни файлове. Те се намират в пространството от имена System.IO , което трябва да бъде включено в проектното решение. По-важните класове са Directory за управление на директории (folder), File за работа с файлове, класове в наименованията на които са включени думите Reader и Writer, съответно за четене и запис, Exception за прихващане и обработка на възникнали изключения (грешки) и др. Част от методите са предназначени за четене на определени параметри и започват с ключовата дума Get , съответно за назначаване – Set и др.

Основният клас File е статичен и не могат да се създават нови инстанции с помощта на New. Следователно неговата единствена инстанция се споделя навсякъде в програмата. Не могат да се създават негови производни класове. Методите на класа File са също статични и осигуряват основните операции с файлове: създаване, копиране, изтриване, преместване и отваряне.

Класът FileInfo има същото предназначение както File. Разликата се състои в това,че класът FileInfo притежава конструктор и следователно могат да се създават негови инстанции за всеки отделен файл с помощта на New. На класа Directory съответствува DirectoryInfo.

Във Visual Basic.Net e въведен абстрактния базов клас Stream, който е предназначен за работа с потоци. Негови производни класове са FileStream, StreamWriter, MemorySream и т.н. Разликата между файлове и потоци е тази, че докато файлът се възприема като групирана и локализирана информация, притежаваща име използвано като идентификатор, то потоците не са обвързани с конкретна конфигурация и могат да бъдат разпределени в мрежа или локализирани, например като временни в паметта. Потоците също могат да притежават указатели и методи за четене или запис.

Развитието на файловата система по направление на структурирани данни, създаването и поддържането на релации между тях, управление на достъпа до данните в мрежа, посредством програмни доставчици и други услуги води до промяна на концепцията на външните файлове, до използването на системи за управление на бази от данни, до предлагането на програмни средства за достъп, контрол и управление на транзакции. Проблемите свързани с проектирането на програмни системи, използващи локални бази от данни и системи за тяхното управление, са обект на следващите упражнения.

Независимо от нивото на проектиране и използваните програмни средства за управление на директориите и поддържането на тяхната структура не е отпаднал като проблем при разработката на програмни системи с външни файлове.
2. Цел на лабораторното упражнение.
Настоящото упражнение има за цел да запознае студентите с включените във VS.NET класове за изграждане и поддържане на директории и файлове, за управление на достъпа до тях, за проектиране на комуникациите между програмната и файловата системи.

Последователно са разгледани методите и свойствата на предлаганите класове за работа с файлове и директории в контекста на практически задачи при проектиране на програмни системи с външни файлове.

Упражнението предоставя необходимата информация за възможностите на VB.NET свързани с управление и поддържане на файлови структури, за изграждане на информационен интерфейс между програмата и файловете с данни, за управление на информационния обмен и др.

Представените примери за достъп и управление на данните позволяват изграждането на практически умения за проектиране и програмиране на системи с външни файлове.


3. Управление на директории.
Програмната система, като изпълним файл /файлове/ се съхранява в определена директория /folder/. Местоположението й във файловата структура на компютърната конфигурация, обикновено се задава при инсталиране на програмната система. Проблемът с данните не винаги е определен еднозначно. Те могат да се съхраняват в строго определена и не подлежаща на промяна директория, да се разполагат в поддиректория на основната директория или в поддиректория на директорията в която е инсталирана програмната система. (В упражнението не се разглеждат случаите когато данните се намират на отдалечени компютърни конфигурации и достъпа до тях е посредством локална мрежа или Интернет).

Независимо от проектното решение, основно проблемите могат да се групират по следния начин:



  • проверка за съществуване на определен път и директория,

  • създаване на директория по зададен път и наименование,

  • изтриване на директория при спазване на изискването да не съдържа файлове,

  • определяне на параметри, свързани с дървовидната структура на директориите и техните поддиректории, файловото съдържание на определена директория, обема на заетата памет, времето и датата на създаване на директорията, на нейното последното използване и др.

Основният клас, осигуряващ чрез своите методи създаване, копиране, преместване, изтриване и преименуване на директории е Directory, намиращ се в пространството от имена System.IO. Класът поддържа следните по-важни методи:



  • CreateDirectory – създава нова директория по зададен път. Задължително пътят трябва да бъде коректен и наименованието на директорията трябва да бъде уникално в списъка на по-горната директория.

  • Exists – проверява наличието на директория с посочено име и път за достъп. При върната стойност True директорията е намерена. Този метод е удобен за проверка за наличие на директория преди нейното създаване.

  • Delete – изтрива директория с посоченото име и път за достъп. Задължително условие е директорията да не съдържа файлове.

  • Move – за преместване на директория от един път за достъп към друг.

  • Get..... – група от методи за четене на информация свързана с избрана директория (директории). GetCreationTime – чете времето за създаване на директория, GetCurrentDirectory - връща текущата директория на приложението. Методът се използва при изпълнение на програми, инсталирани в различни (произволни) директории или такива определени при инсталацията на програмата.. GetDirectoryRoot – чете името на коренната директория и обема информация, GetDirectories – връща имената на поддиректориите в обявената директория. GetLastAccessTime – предоставя информация за датата и времето за последното влизане в директорията, GetLastWriteTime – връща датата и часа на последния запис в директорията, GetParent – чете абсолютния или относителен път на родителската директория

  • Set ...... – група от методи за назначаване стойности на определени параметри. SetCreationTime – поставя датата и часа на създаването на определената директория, SetLastAccessTime - поставя датата и часа на последния достъп в описаната директория.

4. Задание за лабораторно упражнение.


Да се разработи програма за демонстрация и изпълнение на основните методи на класа Directory свързани със създаване, управление и унищожаване на директории и поддиректории, четене и назначаване на параметри.

За целта:

4.1. Създайте нов проект с форма Form1 и меню с основни позиции: Folder, Get и Set . Позициите на първият падащ списък са CreateDirectory, Exists, Delete и Move, за втория: CreationTimе, CurrentDirectory, DirectoryRoot, Directories, LastAccessTime, LastWriteTime и GetParent, за третия списък: CreationTime и LastAccessTime. Фиг.2.1.

Фиг. 2.1.

Проект на формата “Управление на директории”


4.2.Във формата поставете Label1- [Проверка за съществуване на директория] за визуализиране наименованието на изпълняваното действие, Label2- [Въведената директория съществува] за визуализиране на получения резултат, TextBox1- [C:\Proba\] за въвеждане на информация, необходима при изпълнението на определени методи и ListBox1 за визуализиране на списък от поддиректории.

4.3. В събитийната процедура Exists поставете следния програмен код:


MyPath = TextBox1.Text

Label1.Text = "Проверка за съществуване на директория."

If MyPath.Trim <> "" Then

If Directory.Exists (MyPath) = True Then

Label2.Text = "Въведената директория съществува!"

Else

Label2.Text = "Въведената директория или посочения път не съществуват!"

End If

Else

Label2.Text = "Въведете името и пътя на директорията!"

TextBox1.Focus ()

End If

където MyPath e обявена като общодостъпна стрингова променлива.


4.4. Аналогично, при избор на позиция CreateDirectory в съответната й събитийна процедура поставете следния код:
MyPath = TextBox1.Text

Label1.Text = "Създаване на нова директория."

If MyPath.Trim <> "" Then

If Directory.Exists (MyPath) = True Then

Label2.Text = "Въведената директория съществува!"

Else

Label2.Text = "Въведената директория или посочения път не съществуват!"

Dim Ans As Integer

Ans = MsgBox("Създаване на нова директория " + MyPath, 20, "Потвърдете !")

If Ans = 6 Then Directory.CreateDirectory((MyPath))
End If

Else

Label2.Text = "Въведете името и пътя на директорията!"

TextBox1.Focus ()

End If



    1. Програмирайте позиция Delete като преди изтриването проверете нейното наличие. Ако директорията съдържа файлове изтриването няма да се изпълни. .(Внимание ! Не изтривайте чужда директория)

Dim MyPath As String

MyPath = TextBox1.Text

Label1.Text = " Изтриване на директория”

If MyPath.Trim <> "" Then

If Directory.Exists(MyPath) = True Then

Label2.Text = " Въведената директория съществува!

Dim Ans As Integer

Ans = MsgBox("Изтриване на директория " + MyPath, 20, " Потвърдете!")

If Ans = 6 Then Directory.Delete((MyPath))

Else

Label2.Text = " Въведената директория или посочения път не съществуват!"

End If

Else

Label2.Text = " Въведете името и пътя на директорията!"

TextBox1.Focus()

End If



    1. За позиция CurrentDirectory програмния код е следния:


MyPath = TextBox1.Text

Label1.Text = "Определяне на текущата директория."

If Directory.GetCurrentDirectory.Trim <> "" Then

Label2.Text = Directory.GetCurrentDirectory.Trim

End If


    1. В събитийната процедура активирана при избор на позиция CreationTime поставете следния програмен код:



MyPath = TextBox1.Text


Label1.Text = "Времето на създаване на директорията."

If MyPath.Trim <> "" Then


If Directory.Exists (MyPath) = True Then

Label2.Text = "Директорията е създадена на: " +

Format (Directory.GetCreationTime (MyPath), "dd, MM,yyyy")

Else

Label2.Text = "Въведената директория или посочения път

не съществуват!"

End If

Else

Label2.Text = "Въведете името и пътя на директорията!"

TextBox1.Focus ()

End If


    1. Програмирайте събитийната процедура на позиция Directories като включите следния код:


If Directory.Exists (MyPath) = True Then

Dim ListFolders As String () = Directory.GetDirectories (MyPath)

Dim SubDirectory As String

For Each SubDirectory In ListFolders


ListBox1.Items.Add (SubDirectory)

Next SubDirectory

Else

Label2.Text = "Въведената директория или посочения път не

съществуват!”

End If


    1. Разработете и останалите позиции от втория падащ списък. При визуализация на дата и време използвайте Format с подходящ шаблон.




    1. За назначаването на дата за определена директория в събитийната процедура на позиция от третия падащ списък поставете следния програмен текст:


MyPath = TextBox1.Text

Label1.Text = "Назначаване на дата за директория."

Directory.SetCreationTime (MyPath, "20.07.2004")

Label2.Text = Directory.GetCreationTime (MyPath)
Датата може да бъде въвеждана динамично. За целта в проекта трябва да поставите TextBox2. Задължителна е проверката дали въведената информация отговаря на форматните изисквания.

За да проверите резултата изберете Get| CreateDirectory.




    1. По аналогичен начин програмирайте и втората позиция от падащия списък.

5. Управление на файлове.


VB.NET предлага множество от класове за работа с външни файлове. Основният клас е File. Той е предназначен за създаване, отстраняване, отваряне, копиране и преместване на файлове като използва класа FileStream производен на абстрактния клас Stream . Методите включени в класа File могат да се групират по следния начин:

  • методи за манипулиране на файловете: Exists – проверка за наличност на файла при посочен път до него, Delete – изтриване на файл, Copy - копиране на файлове, Move – преместване на файл от една директория в друга,

  • методи свързани с текст: CreateText – създаване, AppendText – добавяне и OpenText – отваряне на текстов файл, OpenRead – отваряне за четене, OpenWrite – за запис и др.

  • Get – поредица от методи за прочитане на информация за файловете: GetAttributes – за атрибутите на файла GetCreationTime - времето за създаване на файла, GetLastAccessTime – времето на последния достъп до файла, GetLastWriteTime – на последната корекция (запис) и др.

  • Set – методи за назначаване на отделни параметри: SetAttributes – за назначаване на атрибути, SetCreationTime – промяна на времето за създаване на файла, SetLastAccessTime – определяне на времето за последното отваряне и SetLastWriteTime – въвеждане (промяна) на времето на последния запис.

Класът FileInfoе аналогичен на класа File и притежава собствен конструктор Следователно могат да се създават негови инстанции за конкретни файлове. FileLoadExceptionза регистриране и управление на изключенията, възникнали при зареждане на файл с методи: FileName – изключението е свързано с името на файла, Source – източника на грешка, TargetSite – причина за изключението е в асоциираното име на метода, InnerException – вътрешно изключение, което е причина за текущото изключение, Message - изключение Error Message и др.

Класът FileNotFoundException регистрира изключение, когато асоциираният файл не е открит в определеният път или при невалиден достъп при диска. Методите са аналогични на предния клас. Класът IOException индицира изключение, когато се появи грешка от типа Input/Output. Класът FileSystemWatcher регистрира и обработва промените, настъпили във файловата система, като промяна на име, изтриване или създаване на даден файл .

Във VB.NET съществува множество от класове, които са свързани с осигуряване надеждността и защитата на данните, като например FileIOPermissionAccess, FileIOPermission и др. Те не са обект на настоящото упражнение.

6. Задание за лабораторно упражнение.


Да се разработи програма за демонстрация и изпълнение на основните методи на класа File свързани със създаване , управление и унищожаване на файлове, четене и назначаване на техни параметри.

За целта:



    1. Създайте нов проект с форма Form1 и меню с основни позиции: File, Open, Get и Set . Позициите на първият падащ списък са: Exists, Delete, Copy и Move. За втория списък – OpenText, OpenRead, OpenWrite и AppendText. За третия падащ списък – GetAttributes, GetCreationTime , GetLastAccessTime и GetLastWriteTime, за последния списък – SetAttributes, SetCreationTime, SetLastAccessTime и SetLastWriteTime.Фиг.2.2.



Фиг.2.2.

Проект на форма “Управление на файлове”




    1. Във формата поставете Label11 за визуализиране наименованието на изпълняваното действие, Label12 за визуализиране на получения резултат, TextBox1 за въвеждане на информация, необходима при изпълнението на определени методи и ListBox1 за визуализиране на списъчна информация.




    1. Променливата MyPath направете общодостъпна за всички процедури от класа Form1.




    1. В събитийната процедура Exists поставете програмен текст аналогичен на същият метод в класа Directory:


MyPath = TextBox1.Text

Label1.Text = "Проверка за съществуване на файл."

If MyPath.Trim <> "" Then

If File.Exists (MyPath) = True Then

Label2.Text = "Въведеният файл съществува!"

Else

Label2.Text = "Въведеният файл или посочения път не

съществуват!"

End If

Else

Label2.Text = "Въведете името и пътя на файла!"

TextBox1.Focus ()

End If


    1. По аналогичен начин програмирайте събитийните процедури за изтриване, копиране и преместване на файл.




    1. За прочитане на текстов файл програмният код е следния:



MyPath = TextBox1.Text

Dim objBinReader As New BinaryReader (File.Open (MyPath,

FileMode.Open))

RichTextBox1.Text = ""

Do While objBinReader.PeekChar.ToString <> "-1"

Try

RichTextBox1.Text = RichTextBox1.Text + objBinReader.ReadChar



Catch

MsgBox (objBinReader.PeekChar.ToString, , "")

Exit Do

End Try


Loop

objBinReader. Close ()

В примера се използва факта, че BinaryReader връща –1 при достигане края на файла. Вариантно решение може да се програмира като се използва възникване на изключение при достигане край на файла. Кодът на изключението трябва да се анализира т.к. изключение може да възникне и при други случаи.

Препоръчително е да се програмира проверка за наличие на търсения файл преди неговото прочитане.


    1. За събитийната процедура, съответствуваща на OpenWrite допълнете кода със следните оператори:



MyPath = TextBox1.Text


MyWrite = File.OpenWrite (MyPath)

Dim MyWriter As StreamWriter = New StreamWriter (MyWrite, _

System.Text.Encoding.ASCII)

MyWriter.Write (RichTextBox1.Text)

MyWriter.Close ()

Записването от RichTextBox1 се извършва във ASCII. Следователно горната част на таблицата ( б.а. кирилица) не може да бъде правилно визуализирана след обратното прочитане на файла.




    1. За позиция от списъка AppendText основния програмен код е следния:


Dim MyPath2 As String

Dim TextLine As String

Dim TextPoint As Integer

MyPath = TextBox1.Text

TextPoint = MyPath.IndexOf (".")

MyPath2 = MyPath.Substring (0, TextPoint) + "New.txt"

Dim OutputText As TextWriter = File.AppendText (MyPath2)

Dim IinputText As TextReader = File.OpenText (MyPath)

TextLine = InputText.ReadLine ()

While Not (TextLine Is Nothing)

OutputText.WriteLine (TextLine)

TextLine = InputText.ReadLine ()

End While

InputText.Close ()

OutputText. Close ()

В демонстрационния пример във въведения път и име на файл се открива разделителната точка и към името на новия файл се добавя New. Той се отваря за добавяне и от стария файл информацията се прехвърля в новия файл.

Препоръчително е да се добави програмен текст за организиране на диалога, за проверка на наличен файл, за прихващане на възникнали изключения и др.




    1. Програмирайте позициите от падащите списъци на Get и Set. За времето и датата спазвайте форматните изисквания.




    1. Като използвате метода Attributes на класа FileInfo направете създадения файл скрит (FileSystemAttrebutes.Hidden) и след това го нормализирайте посредством (Normal)

[C#]

StreamReader srRead = new StreamReader(

(System.IO.Stream)File.OpenRead("C:\\Temp\\Test.txt"),

System.Text.Encoding.ASCII);

// set the file pointer to the beginning

srRead.BaseStream.Seek(0, SeekOrigin.Begin);

srRead.BaseStream.Position = 0;

while (srRead.BaseStream.Position < srRead.BaseStream.Length) {

char[] buffer = new char[1];

srRead.Read(buffer, 0, 1);

Console.Write(buffer[0].ToString());

srRead.BaseStream.Position++;

}

srRead.DiscardBufferedData();



srRead.Close();

[C++, JScript] No example is available for C++ or JScript. To view a Visual Basic or C# example, click the Language Filter button in the upper-left corner of the page.

[C#]

if( s.Length==s.Position )



{

Console.WriteLine("End of file has been reached.");

}

[JScript]



if( s.Length==s.Position )

Console.WriteLine("End of file has been reached.");

[C++] No example is available for C++. To view a Visual Basic, C#, or JScript example, click the Language Filter button in the upper-left corner of the page.

7. Задания за самостоятелна разработка.




    1. Да се разработи програма, проверяваща списъка на файловете групиране в определена директория. На тази основа да се проектира и програмира програмна част за търсене на зададен файл по всички директории.




    1. Да се разработи програма, визуализираща дървовидната структура на директории и файлове като се използва TreeView.




    1. Да се разработи програма работеща с външен файл, съдържащ информация за личен персонал. Интерфейсната част да бъде проектирана посредством основно меню с позиции за четене, запис и други функции. Текстови полета за въвеждане на имена, обект за въвеждане на дата на постъпване и дата на напускане на работа, работно време за всеки служител и др.

Част от програмния текст свързан с запис на имена и дата е следния:
Dim outputText As TextWriter = File.AppendText (MyPath)

outputText.WriteLine (TextBox2.Text)

outputText.WriteLine (TextBox3.Text)

TextDate = TextBox4.Text

TextLine = Format (TextDate, "dd.MM.yyyy")

outputText.WriteLine (TextLine)

outputText.Close ()

където датата форматно е преобразувана в стринг.



Основният програмен текст свързан с прочитането на записана информация е следния:
Dim inputText As TextReader = File.OpenText (MyPath)

TextBox2.Text = inputText.ReadLine ()

TextBox3.Text = inputText.ReadLine ()

TextDate = inputText.ReadLine ()

TextBox4.Text = Format (TextDate, "dd.MMM.yyyy")

inputText.Close ()
където датата е форматно преобразувана преди записването и в текстовото поле. Ако датата се записва или прочита без използването на форматното преобразуване, то в нея се съдържат позиции и за време.


    1. Разработете малка информационно-справочна програма работеща с файл, съдържащ градове, пощенски и телефонни кодове. Търсенето на информацията посредством частично или пълно въвеждане на град, пощенски или телефонен код. За ускоряване на процедурата вместо един файл могат да се използва три сортирани файлове, а самото търсене да се извършва по метода за деление на две.








Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница