ASPでは、FSOはファイルシステムオブジェクトであるファイルシステムオブジェクトを意味します。
操作するコンピューターファイルシステムとは、Webサーバーにあることを指します。したがって、これに適切な権限があることを確認してください。理想的には、テストを簡単に実行できるように、独自のマシンにWebサーバーをセットアップできます。 Windowsで実行されている場合は、Microsoftの無料の個人WebサーバーPWSをお試しください。
FSOモデルオブジェクト
ドライブオブジェクト:ディスクまたはネットワークドライブにアクセスするためのオブジェクトを駆動する
FilesystemObjectオブジェクト:コンピューターのファイルシステムにアクセスするためのファイルシステムオブジェクト
フォルダーオブジェクト:フォルダーのすべてのプロパティにアクセスするためのフォルダオブジェクト
TextStreamオブジェクト:ファイルコンテンツにアクセスするためのテキストストリームオブジェクト
上記のオブジェクトを使用して、妨害行為を含むコンピューターで何でもすることができます。データを効率的に保存するための強力で簡単な方法を提供します。
FSOはMicrosoftを搭載しており、ASPはおそらく非窓システムでは使用できなくなりました。
FSOの使用方法は?
FSOを使用してすべての作業を実行するために、最初にオブジェクトを作成するために、コードは次のようなものです。
| <%set fso = server.createObject(scripting.filesystemObject) %> |
これにより、FSOが作成され、変数FSOを割り当てます。馴染みのあるオブジェクトを使用して、ファイルシステムの操作を実行できます。ここでは、FSO.MethodまたはFSO.Propertyを使用できます。これは、次の例で見られます。
FSOモデルは、Scrrun.dllであるMicrosoftが提供するスクリプトランタイムDLLファイルにあります。 MS Access、Wordなど、このDLLファイルを任意のアプリケーションで参照できます。 つまり、ASPに適用することだけではありません。
FSOメソッドの簡単なリストは次のとおりです。
| FSOメソッド | |
| コピーファイル | 1つ以上のファイルを新しいパスにコピーします |
| createTextFile | ファイルを作成し、TextStreamオブジェクトを返します |
| DeleteFile | ファイルを削除します |
| opentextfile | ファイルを開き、読み取りまたは追加するためにTextStreamオブジェクトを返します |
完全なFSOメソッドとプロパティを知りたい場合は、Microsoft MSDNを参照してください。以下の例をいくつか見てみましょう。
ユーザー情報を保存するデータベースを作成できるシンプルなゲストブックを作成するとします。ただし、FSOを使用して情報を保存すると、データベースのパワーが必要ない場合は時間とお金を節約できます。また、一部のISPは、Web上のデータベースアプリケーションを制限する場合があります。
フォームでいくつかのユーザー情報を収集したとしますが、ここに簡単なフォームHTMLコードがあります。
| html> <ボディ> form form action = formhandler.asp method = post> <入力タイプ=テキストサイズ= 10 name = username> <入力タイプ=テキストサイズ= 10 name = homepage> <入力タイプ=テキストサイズ= 10 name = email> < /form> < /ボディ> < /html> |
formhandler.aspでformを処理するコードを見てみましょう:
| <% 'フォーム情報を取得します strname = request.form(username) strhomepage = request.form(homepage) stremail = request.form(email) 'FSOオブジェクトを作成します fso = server.createObject(scripting.filesystemObject)を設定します |
これまでのところ、フォームフィールドの値を取得し、変数に値を割り当てることだけではありません。興味深い部分が以下に表示されます - ファイルを書く:
| PATH = C:Emp Est.txt forreading = 1、forwriting = 2、forappending = 3 'ファイルを開きます file = fso.opentextfile(path、for for appending、true)を設定 '情報をファイルに書き込みます file.write(strname)&vbcrlf file.write(strhomepage)&vbcrlf file.write(stremail)&vbcrlf '閉じてクリーンアップ file.close ファイル=何も設定しません FSO =何も設定しません |
OpenTextFileメソッドは、FSOモデルの別のオブジェクトであるTextStreamオブジェクトを返すことを思い出してください。テキストストリームオブジェクトは、ラインの書き込み、読み取り、スキップなど、ファイルコンテンツを操作する方法を明らかにしています。 VB定数VBCRLFは、新しいライン文字を生成します。
trueは、OpentextFileのコマンドパラメーターで定義されています。これは、ファイルが存在しない場合、それを作成することをシステムに伝えます。ファイルが存在せず、真のパラメーターが定義されていない場合、エラーが発生します。
次に、ディレクトリC:EMP、Open Test.txtに移動すると、次の情報を確認できます。
| ユーザーの名前 ユーザーのホームページ ユーザーのメール |
もちろん、これらの単語は、フォームに入力されたものに置き換えることができます。
これで、いくつかのユーザー情報が簡単なデータベースのようにファイルに保存されます。データベースのような構造化された列がないため、すべての訪問者を知り、関連する部品を登録情報から分離したいユーザーがいるとします。
作成されたファイルでは、1行目がユーザー名、行2はホームページ、3行目はメールアドレスであることがわかっています。登録されたユーザーもこの構造に情報を保存するため、3行ごとに1つのユーザーの登録情報が含まれます。これを知っていると、次のコードを記述して情報を表示できます。
| <% 'FSOオブジェクトを作成します fso = server.createObject(scripting.filesystemObject)を設定します PATH = C:Emp Est.txt 'ファイルを開きます file = fso.opentextfile(path、1)< -forを設定します 読む |
次に、各行を分析し、データをフォーマットします。
| file.atendofStreamまで行います Response.write(name:&file.readline&) Response.write(ホームページ:&file.readline&) Response.write(email:&file.readline&<p>) ループ '閉じてクリーンアップ file.close ファイル=何も設定しません FSO =何も設定しません %> |
これは非常に単純な出力ですが、状況に応じてテーブルまたはDHTMLフォーム情報を含めることができます。
ファイルが正しく作成および書き込まれている場合、上の小さなループはデータベース内のすべての人の情報を適切にリストします。 ReadLineメソッドは、Newlineが発生するまで1行のコンテンツを読み取り、その後のReadLineコールは次の行を読み取ります。 AntendofStreamは、ファイルのテールに遭遇したときに私たちに伝えるTextStreamオブジェクトのプロパティです。
何らかの理由でファイルを正しく形成していないと仮定します。ユーザーが3行ではなく2行しか持っていない場合、いくつかのエラーが発生します。ここでのループは、3行以下の情報がある場合、次のエラーメッセージが表示されます。
| サーバーオブジェクトエラー 'ASP 0177:800A003E' |
したがって、不要な行がファイルに挿入されないようにするか、必要な行情報がない場合、エラー処理コードを追加してください。
基本的な知識について上記で説明し、その後、権限の問題について説明します。 FSOはユーザーアカウントを使用して実行します。つまり、誰かがインターネットからページにアクセスした場合、このインターネットアカウントがFSOを作成します。管理者としてコンピューターにログインし、ページにログインすると、管理者アカウントがFSOを作成します。特定のアカウントには特定のアクセス許可があり、FSOには関数を完全に実行するためにいくつかのアクセス許可が必要なため、これは非常に重要です。
インターネットアカウント(iUSER_MACHINENAME、MachinEnameはサーバーの名前です)は通常、読み取り許可のみを持っています。つまり、ユーザーはGuestBookファイルに書き込むことができません。ただし、この問題をバイパスするにはいくつかのオプションがあります。
まず第一に、ゲストブックに入力する前にユーザーがサーバーにログインすることを要求することも非常に困難です。ただし、ゲストブックの重要なポイントは、匿名ユーザーから情報を収集することであり、ユーザーがログインするように求められた場合、それらが誰であるかを知る必要があります。したがって、このオプションをスキップして、次のオプションをご覧ください。
2番目の方法は、ディレクトリまたはファイルを作成することであり、iuser_machinenameユーザーには書き込みアクセス許可があります。そうすることは、正しいディレクトリを知っており、いくつかのWebスキルを持っている人なら誰でもサーバーのコンテンツを入力できるため、潜在的なセキュリティの脆弱性を開く可能性があります。これは深刻なタブーです。したがって、これらの執筆可能なディレクトリの情報が隠された場所に保存され、これらのディレクトリをWebディレクトリ構造の外側にできるだけ設定していることを確認する必要があります(たとえば、Windowsの下では、これはInetPubディレクトリにないディレクトリです)。
あなたは思うかもしれません:わかりました、今私はファイルに書き込む方法を知っています。しかし、私たちはもっとすることができますか? Webサイトの検索関数を作成してみましょう。
検索エンジンを構築するための鍵は再帰です。主に、ディレクトリ内のファイルを検索するコードを記述し、すべてのディレクトリループで同じコードを実行します。合計のサブディレクトリの数を判断することは不可能なため、検索コードは完了するまで何度も実行する必要があります。再帰的な電話はとても良いです!
検索ページを作成しましょう。ユーザーが検索文字列を入力するHTMLフォームが作成されたとします。
| DIM OBJFOLDER dim strsearchText dim objfso strsearchText = request.form(searchText)<-検索文字列 'FSOおよびフォルダーオブジェクトを作成します fso = server.createObject(scripting.filesystemObject)を設定します objfolder = objfso.getFolder(server.mappath(/))を設定します objfolderを検索します |
上記のコードは変数を初期化するだけで、検索関数は検索関数を実行します。これは次のように説明されています。
| 関数検索(objfolder) Dim objsubfolder '電流内のすべてのファイルをループします フォルダ objfolder.filesの各objfileについて objtextStream = objfso.opentextfile(objfile.path、1)< -set for readingを設定します 'ファイルの内容をaに読んでください 変数 strfilecontents = objtextStream.readall '検索文字列がファイルにある場合 リンクを書きます 'ファイルに If strust(1、strfilecontents、strsearchtext、1)then Response.Write >&objfile.name&< /a >< br> bolfilefound = true ifを終了します objtextStream.close 次 「これが再帰の部分です - それぞれについて 'このディレクトリのサブフォルダーは、検索機能をもう一度実行します objfolder.subfoldersの各objsubfolderについて objsubfolderを検索します 次 エンド関数 |
ファイルを開くことができるためには、FSOにはWebパスではなく実際のファイルパスが必要です。たとえば、www.enfused.com/temp/index.htmlまたは/temp/index.htmlではなく、c:inetpubwwoot empiindex.htmlです。 後者を前者に変換するには、server.mappath(filename)を使用してファイル名を使用して、Webパス名を表します。
上記のコードは、指定する初期ディレクトリの下にあるフォルダーの各サブディレクトリで実行されます。ここで、初期ディレクトリはWeb Root Directory/を参照します。次に、ディレクトリに各ファイルを開き、指定された文字列が見つかった場合、そのファイルへのリンクが表示されます。
ファイルとサブディレクトリの数が増えると、検索にかかる時間が増えることに注意してください。重い検索作業が必要な場合は、Microsoftのインデックスサーバーインデックスサーバーなど、他の方法を取得することをお勧めします。
この時点で、FSOをよく理解している可能性があります。より複雑な問題を解決するために、それをより深く見てみましょう。
まず、ファイルの名前を変更することをお勧めします。すべてのドキュメントを追跡するには、システムによって簡単に区別できるように、それらを一意に変更することをお勧めします。残念ながら、FSOは単純なファイル名の変更操作を許可していないため、変更する必要があります。
| <% 'FSOオブジェクトを作成します fso = server.createObject(scripting.filesystemObject)を設定します PATH = C:Emp Est.txt strdate = cheplage(date()、 /、) strdir = c:inetpubwwwwootarticles&strdate strnewfilename = hour(now)&_&minute(now)&_& Second(now)&.html '古いファイルを開きます file = fso.opentextfile(path、1)< -読み取り用に設定します strtext = file.readall ファイル=何も設定しません 'フォルダーを確認および/または作成します fso.folderexists(server.mappath(strdir))ではない場合 f = fso.createfolder(server.mappath(strdir))を設定 それ以外 f = fso.getfolder(server.mappath(strdir))を設定します ifを終了します '新しいファイルを作成して書き込みます file = fso.createTextfile(f.path&&strnewfilename)を設定します file.write(strtext) f =何も設定しません file.close ファイル=何も設定しません '古いファイルを削除します fso.deletefile(path&&rst(filename)&i) ' 掃除 FSO =何も設定しません %> |
ここではFSO機能の欠如が利点となっており、一度に2つのステップを実行できます。まず、ファイルを開き、ファイルの内容を読み取ります。ここで、一意のフォルダーと一意のファイルを作成して記事を保存するとします。ただし、フォルダーへのパスは毎日変更されるため、最初にフォルダーが既に存在するかどうか、および存在しない場合は作成する必要があります。これは、fso.folderexists snippetではない場合に行われます。次に、そのパスを取り、新しいファイルを作成します。新しいファイルが作成されたら、fso.deletefileを介して実行される古いファイルを削除します。
これらの2つの手順は次のとおりです。ファイルの名前を変更してから、より適切なディレクトリに移動します。新しいファイルに書き込む前にコンテンツを編集するなど、こちらのファイルでより多くの操作を行うこともできることに注意してください。
FSOにはいくつかの弱点があります - たとえば、単語文書、多くのグラフィック形式のファイル、その他のファイルを含むバイナリファイルを処理することは困難です。ただし、これらのファイルを他の方法で操作することができます - それらを移動したり、削除したりすることができます。できないことは、開いたり書いたりすることだけです。
別の制限は、ファイルの長さの問題です。一部のコンテンツがすぐに読み取られて記述されると、すべての情報がメモリに保存されます - コンテンツが多いほど、メモリが消費されます。これにより、すべてのジョブが遅くなります。したがって、非常に大きなファイル、または多数の小さなファイルを操作する必要がある場合は、ファイルを小さな部分に分割し、メモリを頻繁にクリアすることを検討してください。アプリケーションをCOMオブジェクトコンポーネントに組み込むことで、プログラムの速度を大幅に向上させることもできます。
同様に、FSOを使用してアクセス許可を管理することはできません。この方法はCGIとPerlでよく使用されますが、残念ながら、FSOで実装するのに満足のいく方法はありません。
FSOで他に何ができますか?
FSOには多くの素晴らしい機能がありますが、多くの人はそれを認識していません。これらの機能は、しばしば何かをするのが難しいと感じた後に発見されます。
これらの不動のいくつかのいくつかはありますが、非常にクールな機能を紹介します。
めったに理解されないFSO機能
GetSepecialFolderメソッド特定のWindowsフォルダーへのパスを返します。一時的なデータを保存するときに、getabsolutepathnameメソッドがフォルダーに絶対パス(server.mappathに類似)を返します。
たとえば、fso.getabsolutepathname(region)は、次のような結果を返します:c:mydocsmyfolder酸化物
getExtensionNameメソッドパスの最後の部分の拡張機能(たとえば:fso.getExtensionName(c:docs est.txt)がtxtを返します)getBaseNameを返し、getParentFolderメソッドパスの最後の部分の親フォルダーを返します
(たとえば、FSO.GetParentFolder(C:DocsMyDocs)が「docs」を返します)ドライブプロパティは、リソースブラウザーのようなユーザーインターフェイスを確立するためにローカルに利用可能なすべてのドライブのコレクションを返します。
上記の関数を使用する場合、エラー処理用のコードを作成するのが最善です。必要なパラメーターが存在しない場合、面倒な情報が生成されるためです。
要約します
これまで見てきたように、FSOは非常に便利であり、ここで紹介しているのは氷山の一角にすぎません。 FSOを使用して強力なアプリケーションを構築し、多くのタスクを完了することができます。