طراحان و پياده کنندگان برنامه هاي وب در زمان پياده سازي اين نوع برنامه ها به مواردي برخورد مي نمايند که لازم است به سيستم فايل سرويس دهنده وب دستيابي داشته و عمليات متفاوتي را در ارتباط با فايل ها و دايرکتوري ها انجام دهند . مثلا" شرکتي که خدمات hosting را انجام مي دهد ممکن است قصد طراحي يک control panel را داشته باشد تا اين امکان را براي مشتريان خود فراهم آورد که با استفاده از يک اينترفيس وب ، اقدام به ويرايش فايل هاي وب سايت خود نمايند .
در ASP کلاسيک ، به منظور دستيابي به سيستم فايل سرويس دهنده وب ، از FileSystemObject استفاده مي گرديد . در دات نت ، مجموعه اي از کلاس ها به منظور دستيابي به سيستم فايل ، پيش بيني شده است . کلاس هاي فوق در System.IO قرار داشته و از آنان به منظور انجام عمليات متفاوتي استفاده مي گردد :
• بازيابي و نمايش اطلاعات فايل ها و دايرکتوري ها
• عمليات بر روي مسيرها ( ترکيب آنان و استخراج عنصر بخصوصي )
• خواندن و يا نوشتن داده در فايل ها و بافرهاي حافظه
معرفي کلاس ها
از کلاس هاي زير به منظور کار با فايل ها ، دايرکتوري ها و stream استفاده مي گردد :
• Directory : متدهاي استاتيکي به منظور کار با دايرکتوري ها و درايوهاي منطقي را ارائه مي نمايد .
• DirectoryInfo : به منظور کار با يک دايرکتوري خاص و زيردايرکتورهاي آن استفاده مي گردد .
• File : متدهاي استاتيکي به منظور کار با فايل ها را ارائه مي نمايد .
• FileInfo : به منظور کار با يک فايل خاص استفاده مي گردد .
• Stream : کلاس پايه اي که از آن به منظور خواندن و يا نوشتن در يک backing store نظير سيستم فايل و يا شبکه ، استفاده مي گردد .
• StreamReader : با تلفيق يک stream به منظور خواندن کاراکتر از يک backing store استفاده مي شود .
• StreamWriter : با تلفيق يک stream به منظور نوشتن کاراکتر در يک backing store استفاده مي شود .
• TextReader : متدهاي لازم به منظور خواندن کاراکتر از هر منبعي ( نظير backing store ، رشته ها و ....) را ارائه مي نمايد .
• TextWriter : متدهاي لازم به منظور نوشتن کاراکتر در هر منبعي ( نظير backing store ، رشته ها و ....) را ارائه مي نمايد .
• BinaryReader : به منظور خواندن نوع هاي اوليه اي نظير رشته ها ، اعدادصحيح و Boolean از يک stream استفاده مي شود .
• BinaryWriter : به منظور نوشتن نوع هاي اوليه اي نظير رشته ها ، اعدادصحيح و Boolean در يک stream استفاده مي شود .
• FileSystem : به منظور خواندن و نوشتن داده در سيستم فايل استفاده مي شود .
• MemoryStream : به منظور خواندن و نوشتن داده در يک بافر حافظه استفاده مي شود .
backing store : به منبعي که مي توان با استفاده از يک شي Stream داده ئي را در آن نوشت و يا داده ئي را از آن خواند ، اطلاق مي گردد . هر backing store يک شي stream را ارائه مي نمايد که مي توان با استفاده از آن با منبع مورد نظر ارتباط برقرار نمود.
Directory و DirectoryInfo
براي کار با دايرکتوري ها از کلاس هاي Directory و DirectoryInfo استفاده مي گردد . کلاس Directory ، تعدادي متد استاتيک را به منظور انجام عمليات دلخواه بر روي دايرکتوري ها ارائه مي نمايد. کلاس DirectoryInfo ، مجموعه اي ازمتدهاي غير استاتيک به منظور کار بر روي يک دايرکتوري خاص را ارائه مي نمايد. از کلاس هاي فوق به منظور انجام عمليات زير استفاده مي شود :
• ايجاد و حذف دايرکتوري
• تشخيص وجود يک دايرکتوري
• بدست آوردن ليستي از زيرداکتوري ها و يا فايل هاي موجود در يک دايرکتوري خاص
• دريافت اطلاعات در رابطه با دايرکتوري ها نظير تاريخ ايجاد ، صفات و اعمال تغييرات لازم در آنان
• آگاهي از دايرکتوري جاري و تغيير آن ( صرفا" براي کلاس Directory )
• مشخص نمودن ليستي از درايوهاي موجود ( صرفا" براي کلاس Directory )
مثال : استفاده از متد Exists کلاس Directory به منظور تشخيص وجود يک دايرکتوري
تشخيص وجود يک دايرکتوري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% if Directory.Exists("C:\SrcoFolder") then Response.Write("دايرکتوري وجود دارد" ) else Response.Write( "دايرکتوري وجوددارند") end if %> |
متد Exists ، استاتيک است . بنابراين ما مجبور نخواهيم بود که يک متغير و نمونه از کلاس Directory را ايجاد نمائيم .
مثال : استفاده از متد Exists کلاس DirectoryInfo به منظور تشخيص وجود يک دايرکتوري
تشخيص وجود يک دايرکتوري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim dir as DirectoryInfo dir = new DirectoryInfo("C:\SrcoFolder")
if dir.Exists = true then Response.Write( "دايرکتوري وجود دارد") Else Response.Write( "دايرکتوري وجوددارند") end if %> |
براي تشخيص وجود يک دايرکتوري با استفاده از کلاس DirectoryInfo ، مي بايست يک نمونه از کلاس فوق را ايجاد و در ادامه نام دايرکتوري را به عنوان پارامتر در اختيار آن قرار دهيم .
مثال : نمايش تاريخ ايجاد يک دايرکتوري
نمايش تاريخ ايجاد يک دايرکتوري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim dir as DirectoryInfo dir = new DirectoryInfo("C:\SrcoFolder")
if dir.Exists = true then Response.Write( "دايرکتوري وجود دارد") Response.Write( "<br>Created: " & dir.CreationTime ) Else Response.Write( "دايرکتوري وجوددارند") end if %> |
File و FileInfo
براي دستيابي به اطلاعات مرتبط با فايل ها از دو کلاس File و FileInfo استفاده مي گردد . در اين رابطه مي توان عمليات زير را انجام داد :
• ايجاد ، حذف ، باز نمودن ، کپي و انتقال فايل ها ( به منظور نوشتن ، خواندن ، اضافه نمودن و يا بستن فايل استفاده نمي گردد)
• بازيابي اطلاعات مرتبط با فايل ها نظير تاريخ ايجاد ، صفات و اعمال تغييرات لازم در آنان
کلاس File نظير کلاس Directory داراي مجموعه اي از متدهاي استاتيک به منظور انجام عمليات دلخواه در ارتباط با فايل ها است . کلاس FileInfo داراي مجموعه اي از متدهاي غيراستاتيک و خصلت ها به منظور کار با يک فايل خاص است .
مثال : استفاده از متد Exists کلاس File به منظور تشخيص وجود يک فايل
تشخيص وجود يک فايل |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %>
<%
if File.Exists("C:\SrcoFolder\Test.Txt") then Response.Write( "فايل وجوددارد") else Response.Write( "فايل وجود ندارد") end if
%> |
مثال : استفاده از متد Exists کلاس FileInfo به منظور تشخيص وجود يک فايل تغيير و تشخيص دايرکتوري جاري
تشخيص وجود يک فايل |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %>
<%
Dim myfile as FileInfo myfile = new FileInfo("C:\SrcoFolder\Test.Txt")
if myfile.Exists = true then Response.Write( "<br>فايل وجود دارد") Response.Write( "<br>Created: " & myfile.CreationTime ) else Response.Write( "<br/>فايل وجود ندارد") end if
%> |
تغيير و تشخيص دايرکتوري جاري
زماني که يک صفحه ASP.NET اجراء مي گردد ، thread استفاده شده به منظور اجراي کد لازم جهت توليد صفحه ، به صورت پيش فرض داراي دايرکتوري جاري Windir%\System32 % است . در صورت پاس دادن پارامتري نظير نام يک فايل به هر يک از کلاس هاي System.IO ، در دايرکتوري جاري عمليات مورد نظر انجام خواهد شد ( فرض مي شود که فايل در دايرکتوري جاري است ).
بازيابي و تغيير دايرکتوري جاري از جمله عملياتي است که توسط کلاس Directory انجام مي شود . مثال زير نحوه تغيير دايرکتوري جاري با استفاده از SetCurrentDirectory و بازيابي مجدد آن توسط GetCurrentDirectory را نشان مي دهد .
تغيير و بازيابي دايرکتوري جاري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %>
<%
Directory.SetCurrentDirectory("C:\Test") Response.Write( "مسير جاري: " & _ Directory.GetCurrentDirectory() ) %> |
نمايش ليست درايوهاي منظقي موجود
به منظور نمايش ليست درايوهاي منطقي موجود از متد GetLogicalDrives کلاس Directory استفاده مي شود . متد فوق ، آرايه اي از نوع string شامل ليست درايوهاي موجود را برمي گرداند .
تغيير و بازيابي دايرکتوري جاري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %>
<%
Directory.SetCurrentDirectory("C:\Test") Response.Write( "مسير جاري: " & _ Directory.GetCurrentDirectory() ) %> |
ايجاد يک دايرکتوري
براي ايجاد يک دايرکتوري از متد CreateDirectory کلاس Directory استفاده مي شود . کد زير نحوه ايجاد يک ساختار سلسله مراتبي از دايرکتوري هاي مورد نياز را نشان مي دهد .
ايجاد دايرکتوري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %>
<% Directory.CreateDirctory("C:\Test1\Test2\Test3") %> |
پس از فراخواني متد CreateDirectory ، در ابتدا بررسي لازم در رابطه با وجود يک دايرکتوري با نام Test1 در درايو C انجام مي شود ، در صورتي که دايرکتوري فوق وجود نداشته باشد ، آن را ايجاد مي نمايد . در ادامه بررسي لازم در رابطه با دايرکتوري Test2 انجام خواهد شد و در صورت عدم وجود يک دايرکتوري با اين نام در دايرکتوري Test1 ، اين دايرکتوري نيز ايجاد مي گردد . در نهايت ، متد CreateDirectory بررسي لازم در رابطه با دايرکتوري Test3 را انجام مي دهد و در صورتي که اين دايرکتوري در مسير مربوطه نيز وجود نداشته باشد ، آن را ايجاد مي نمايد .
نکته : در صورتي که سعي نمائيم يک دايرکتوري را با نام خاصي ايجاد نمائيم که قبلا" ايجاد شده است ، با يک Exception مواجه نخواهيم شد . در صورتي که مي خواهيم از وجود يک دايرکتوري قبل از ايجاد آن مطمئن شويم ، مي توان از متد Directory.Exists استفاده نمود . در صورتي که هر يک از بخش هاي آرگومان متد CreateDirectory نادرست باشند، با يک ArgumentException مواجه خواهيم شد .
مثال : نمايش محتويات يک دايرکتوري
کلاس Directory داراي متدهاي متعددي به منظور بازيابي محتويات يک دايرکتوري است :
عملکرد | پارامتر | متد |
آرايه اي از نوع Stringشامل نام هر يک از دايرکتوري هاي موجود در مسير مشخص شده ، برگردانده مي شود . | Pathname | GetDirectories |
مثال |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim dir As String Dim Subdirs() As String Subdirs=Directory.GetDirectories("C:\") For Each dir in Subdirs Response.Write( dir & "<br />" Next %> |
عملکرد | پارامتر | متد |
آرايه اي از نوع Stringشامل نام هر يک از دايرکتوري هاي موجود در مسير مشخص شده و منطبق با الگوي جستجو ، برگردانده مي شود. | Pathname, Search Path | GetDirectories |
مثال |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim dir As String Dim Subdirs() As String Subdirs=Directory.GetDirectories("C:\" , "Sa*") For Each dir in Subdirs Response.Write( dir & "<br />" Next %> |
عملکرد | پارامتر | متد |
آرايه اي از نوع Stringشامل نام هر يک از فايل هاي هاي موجود در مسير مشخص شده ، برگردانده مي شود . | Pathname
| GetFiles |
مثال |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim f As String Dim files() As String files=Directory.GetFiles("C:\Test" ) For Each f in files Response.Write( f & "<br />" Next %> |
عملکرد | پارامتر | متد |
آرايه اي از نوع Stringشامل نام هر يک از فايل هاي هاي موجود در مسير مشخص شده و منطبق با الگوي جستجو ، برگردانده مي شود. | Pathname, Search Path
| GetFiles |
مثال |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim f As String Dim files() As String files=Directory.GetFiles("C:\Test","sa*" ) For Each f in files Response.Write( f & "<br />" Next %> |
عملکرد | پارامتر | متد |
آرايه اي از نوع Stringشامل نام هر يک از فايل ها و دايرکتوري هاي موجود در مسير مشخص شده ، برگردانده مي شود . | Pathname | GetFileSystemEntries |
مثال |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim item As String Dim items() As String items=Directory.GetFileSystemEntries("C:\Test") For Each item in items Response.Write( item & "<br />" Next %> |
عملکرد | پارامتر | متد |
آرايه اي از نوع Stringشامل نام هر يک از فايل ها و دايرکتوري هاي موجود در مسير مشخص شده است و منطبق با الگوي جستجو ، برگردانده مي شود. | Pathname, Search Path | GetFileSystemEntries |
مثال |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Dim item As String Dim items() As String items=Directory.GetFileSystemEntries("C:\Test","sa*") For Each item in items Response.Write( item & "<br />" Next %> |
کلاس DirectoryInfo نيز داراي متدهاي GetDirectories ، GetFiles و GetFileSystemEntries است که داراي عملکردي مشابه متدهاي کلاس Directory مي باشند . در اين رابطه دو تفاوت عمده وجود دارد :
• پارامترPathname به عنوان آرگومان در اختيار متدهاي اشاره شده در کلاس DirectoryInfo قرار داده نمي شود. ( کلاس DirectoryInfo داراي آگاهي لازم در ارتباط با مسير مي باشد ).
• متدهاي فوق ،آرايه اي از نوع String را برنمي گردانند . متد GetDirectories آرايه اي از نوع DirectoryInfo ، متد GetFiles آرايه اي از نوع FileInfo و متد GetFileSystemEntries ، آرايه اي از نوع FileSystemInfo را بر مي گرداند .
حذف يک دايرکتوري
براي حذف يک دايرکتوري مي توان از متدهاي Directory.Delete و يا DirectoryInfo.Delete استفاده نمود. کد زير نحوه انجام اين کار را نشان مي دهد :
حذف يک دايرکتوري |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Directory.Delete("C:\Test") Dim dir As DirectoryInfo dir = New DirectoryInfo("C:\Test") dir.Delete %> |
توضيحات
در صورتي که قصد حذف يک دايرکتوري را داشته باشيم که موجود نمي باشد ، با يک خطاي DirectoryNoFound ، مواجه خواهيم شد. اگر قصد حذف يک دايرکتوري را داشته باشيم که در آن فايل و يا دايرکتوري هاي ديگري موجود مي باشد، با يک خطاي IOException مواجه خواهيم شد. براي حل اين مسئله ، مي توان از نسخه overload متد Delete استفاده نمود. در چنين مواردي در زمان استفاده از متد Delete ، مي بايست در رابطه با حذف و يا عدم حذف فايل ها و يا دايرکتوري هاي موجود در يک دايرکتوري تعيين تکليف شود. کد زير نحوه انجام اين کار را نشان مي دهد :
حذف يک دايرکتوري با تعيين تکليف در رابطه با فايل ها و دايرکتوري ها موجود در آن |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% Directory.Delete("C:\Test",True) Dim dir As DirectoryInfo dir = New DirectoryInfo("C:\Test") dir.Delete (True) %> |
حذف يک فايل
براي حذف يک فايل مي توان از متدهاي File.Delete و يا FileInfo.Delete ، استفاده نمود . کد زير نحوه انجام اين کار را نشان مي دهد :
حذف يک فايل |
<%@ Language="VB" %> <%@ Import Namespace="System.IO" %> <% File.Delete("C:\Test.txt") Dim file1 As FileInfo file1 = New FileInfo("C:\Test.txt") file1.Delete %> |
توضيحات
در صورتي که قصد حذف فايلي را داشته باشيم که موجود نمي باشد ، با يک خطاء و يا exception خاصي برخورد نخواهيم کرد، مگر اين که بخشي از آدرس مشخص شده در مسير ( Pathname ) وجود نداشته باشد . در چنين مواردي با خطائي از نوع DirectoryNotFoundException مواجه خواهيم شد .
خصلت ها و صفات فايل ها و دايرکتوري ها
توضيحات | Read/ Write | نوع | نام |
صفاتي نظير Hidden، archiveو Read-only ، مرتبط با يک فايل را برمي گرداند . | R/ W | FileAttributes | Attributes |
زمان ايجاد فايل و يا دايرکتوري را برمي گرداند | R / W | System.DateTime | CreationTime |
آخرين زمان مراجعه به فايل و يا دايرکتوري را برمي گرداند | R/ W | System.DateTime | LastAccessTime |
آخرين زمان ويرايش يک فايل و يا دايرکتوري را برمي گرداند | R/ W | System.DateTime | LastWriteTime |
وضعيت موجود بودن يک فايل و يا دايرکتوري را مشخص مي نمايد. | R | Boolean | Exists |
انشعاب فايل و يا دايرکتوري را برمي گرداند ( به همراه نقطه). براي يک دايرکتوري،انشعاب متن موجود پس از آخرين نقطه در نام است . | R | String | Extension |
نام فايل و يا دايرکتوري را متناسب با نام دايرکتوري مربوطه بر مي گرداند . | R | String | Name |
نام کامل فايل و يا دايرکتوري را برمي گرداند . | R | String | FullName |
متدهاي کلاس FileSystemInfo
توضيحات | نام |
حذف فايل و يا دايرکتوري | Delete |
بهنگام سازي هر نوع اطلاعات cacheشده( نظير تاريخ ايجاد فايل) | Refresh |
وضعيت موجود بودن يک فايل و يا دايرکتوري را مشخص مي نمايد. | Exists |
مثال : ايجاد يک مرورگر فايل و دايرکتوري
براي آشنائي با نحوه استفاده ازصفات و برخي متدها و خصلت هاي کلاس هاي DirectoryInfo و FileInfo به بررسي يک مثال کاربردي ( ايجاد يک مرورگر فايل ) ، خواهيم پرداخت . برنامه فوق يک مسير(PathName ) را از ورودي دريافت و تمامي فايل ها و دايرکتوري ها موجود در آن را نمايش خواهد داد .
مرحله اول : تايپ کد زير با استفاده از يک ويرايشگرايجاد يک مرورگر فايل و دايرکتوري |
<%@ Import Namespace="System.IO" %>
<script runat="server"> Sub Page_Load( sender as object, e as EventArgs) if not Request("dir") is nothing then DirName.Value = Request("dir") end if End Sub </script>
<Html dir="rtl"> <font face="Tahoma" size="3"> <h3>مرورگر فايل و دايرکتوري</h3></Font> </html>
<form runat="server" dir="rtl"> نام دايرکتوري<input type="text" id="DirName" size="20" dir="ltr" value="c:\program files\internet explorer" runat="server" > <input type="submit" value="مشاهده"> </form>
<% dim dir as DirectoryInfo dim anchor as string
' Get the information about the selected directory
dir = new DirectoryInfo( DirName.Value )
Response.Write("<h4>دايرکتوري هاي موجود در" & DirName.Value & "</h4>")
Response.Write("<table>") Response.Write("<tr bgcolor=""#336699"" style=""border-collapse: collapse; color: #ffffff"">") Response.Write("<td>") Response.Write( "نام" ) Response.Write("<td>") Response.Write( "تاريخ آخرين تغييرات" ) Response.Write("</tr></font>")
dim SubDir as DirectoryInfo
for each SubDir in dir.GetDirectories() anchor = "<a href='" & "FileBrowser.aspx?dir=" & SubDir.FullName & "'>" + SubDir.Name & "</a>" Response.Write("<tr dir=""ltr"">") Response.Write("<td>" & anchor & "</td>" ) Response.Write("<td>" & SubDir.LastWriteTime & "</td>" ) Response.Write("</tr>") next
Response.Write("</table>")
if ( not dir.Parent is nothing ) then anchor = "<a href='" & "FileBrowser.aspx?dir=" & dir.Parent.FullName & "'>" & dir.Parent.FullName & "</a>" Response.Write("<p>دايرکتوريريشه" & anchor ) end if
Response.Write("<h3>فايل هاي موجوددر" & DirName.Value & "</h3>")
Response.Write("<table>") Response.Write("<tr bgcolor=""#336699"" style=""border-collapse: collapse; color: #ffffff"">") Response.Write("<td>نام فايل</td>" ) Response.Write("<td>تاريخ آخرين تغييرات</td>" ) Response.Write("<td>ظرفيت</td>" ) Response.Write("<td>وضعيت فايل</td>" ) Response.Write("</tr>")
dim f as FileInfo dim mystr As String
for each f in dir.GetFiles() Response.Write("<tr dir=""ltr"">") Response.Write("<td>" & f.Name ) Response.Write("<td>" & f.LastWriteTime & "</td>") Response.Write("<td>" & f.Length.ToString() & "</td>" ) if ( (f.Attributes and FileAttributes.ReadOnly) <> 0 ) then mystr ="فقط خواندني" end if if ( (f.Attributes and FileAttributes.Hidden) <> 0 ) then mystr ="مخفي" end if if ( (f.Attributes and FileAttributes.System) <> 0 ) then mystr ="سيستم" end if if ( (f.Attributes and FileAttributes.Archive) <> 0 ) then mystr ="آرشيو" end if Response.Write( "<td>" & mystr & "</td>" ) Response.Write("</tr>") next Response.Write("</table>") %> |