DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33174 / inTopicNo.1)  FTPサーバー内を全削除する方法
  
□投稿者/ たに 一般人(1回)-(2015/11/12(Thu) 00:46:36)
  • アイコン環境/言語:[環境(windows7 32bit)/言語(VB.NET2008)] 
    分類:[.NET] 

    初めて掲示板等で質問します。
    よろしくお願いいたします。

    VB.NET初心者で説明が下手なので、箇条書きでやりたいことを書きます。
    ・FTPサーバーにあるフォルダー及びファイルを削除したい。
    ・削除するのは、指定されたディレクトリー(現段階ではプログラム内で固定)以下最下層まですべて(ファイルとディレクトリあわせて最大90個まで)
    ・各フォルダーにファイルは存在する

    上記を実現するなら、いったんすべてのpathを配列に保管して、再度配列を順番に読み込んでファイルのみを削除して、最後に指定フォルダで全削除できるのでは?と思って下記のように作ってみたのですが、途中でどうしたらよいのかわからなくなってしまいました。
    このまま進めても大丈夫でしょうか。

    全くダメなようであれば、実現できるサンプルソースをご教示いただけると大変助かります。

    以下はソースです。

    Dim dirUri As string = "ftp://Id:Pass@IPアドレス/指定ディレクトリー名/"
    Dim WorkFolder() As string = Nothing
    Dim ListCnt As Integer = 0
    Me.ftpCredential = (Id,Pass)
    WorkFolder = New String(99) {dirUri}

    GetList(dirUri,WorkFolder,ListCnt)
    FileDelete(WorkFolder)  … ディレクトリー内のリストカウントが0はファイルと判断して削除
    FolderDelet(dirUri)  … 指定ディレクトリーで削除(この部分は作成済みで稼働も確認できています)


    Private Founction GetList(ByVal dirUri As String, ByVal WorkFolder As String(99), ByVal ListCnt As Integer) As String

    Dim ftpReq As System.Net.FtpWebRequest
    Dim ftpRes As System.Net.FtpWebResponse
    Dim line As String = Nothing

    ftpReq = DirectCast(System.Net.WebRequest.Create(dirUri),System.Net.FtpWebRequest)
    ftpReq.KeepAlive = True
    ftpReq.Credentials = Me.ftpCredential
    ftpReq.Method = System.Net.WebRequest.Methods.Ftp.ListDerectory

    ftpRes = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
    Using ListTarget As New System.IO.StreamReader(ftpRes.GetResponseStream())
    LineCnt = LineCnt + 1
    line = ListTarget.ReadLine()
    WorkFolder(LineCnt) = dirUri & line
    GetList(dirUri,WorkFolder,ListCnt) … 再帰
    End Using

    Return WorkFolder

    End Founction


引用返信 削除キー/
■33177 / inTopicNo.2)  Re[1]: FTPサーバー内を全削除する方法
□投稿者/ kiku 一般人(2回)-(2015/11/16(Mon) 13:39:38)
  • アイコン
    > 上記を実現するなら、いったんすべてのpathを配列に保管して、再度配列を順番に読み込んでファイルのみを削除して、最後に指定フォルダで全削除できるのでは?と思って下記のように作ってみたのですが、途中でどうしたらよいのかわからなくなってしまいました。

    具体的にどこがわからなくなったのでしょうか?

    > このまま進めても大丈夫でしょうか。

    質問者さんのスキルがわからないため、回答できません。
    自身で判断するしかないと思います。

    > 全くダメなようであれば、実現できるサンプルソースをご教示いただけると大変助かります。

    質問者さん自身の力で解決できるようになるための
    アドバイスならこの掲示板で回答が得られると思いますが、
    そのためには質問者さん自身で自力で解決するための努力が必要になります。
    またその努力の結果、的を絞った具体的な質問事項が
    出てくると思いますので、それをこの掲示板で質問すれば
    比較的早く回答が得られると思います。


    今回提示のあったサンプルですが、
    そのままでは文法エラーでビルドすらできない状況でした。
    せめてビルドができるぐらいまでは努力なさった方が良いと思います。

    今回実現したい内容なら、下記URLを参考に
    実装すれば実現可能かと思います。

    http://dobon.net/vb/dotnet/internet/ftpwebrequest.html#listdirectory

    ポイントとしては、一覧で取得した名前が、
    ディレクトリなのかファイルなのか判断するところかと思います。
    FtpWebRequestには、名前を指定してディレクトリか、ファイルかを判断できる
    メソッドが存在しないようで、一覧で取得した応答結果から
    判断するようです。その応答はもしかすると、
    FTPサーバによって変わる可能性があるため
    FTPサーバを限定した方が、開発が楽になると思われます。

    実現するために必要なメソッド群

    ・ディレクトリを指定してそのディレクトリを削除するメソッド
     ※中身にディレクトリまたはファイルが存在してもOK。

     ・指定ディレクトリ内の一覧を取得。
     ・一覧の名前がディレクトリかファイルかを判断する。
     ・ディレクトリなら、そのサブディレクトリを指定して、そのサブディレクトリを削除。(再起呼び出し)
     ・ファイルなら、そのファイルを削除。
     ・一覧内のすべてのディレクトリまたはファイルの削除が終了したら、
      指定ディレクトリを削除する。

    以上です。がんばってください。

引用返信 削除キー/
■33181 / inTopicNo.3)  Re[2]: FTPサーバー内を全削除する方法
□投稿者/ たに 一般人(2回)-(2015/11/18(Wed) 03:28:48)
  • アイコンkikuさん

    アドバイスありがとうございます。
    投稿したソースはまだビルドが通っていない時の内容でUPしていたようです。
    すみませんでした。
    実際には、配列の中に格納できるのが最初に指定したディレクトリの中にあるものだけで、
    その下層のディレクトリに移動できず、先に進めませんでした。

    自分で何度もソースとにらめっこをしているうちに、URI指定がされていないことに気付いて追加したりしたところ、
    完全ではありませんが、ある程度まではなんとかやりたい内容を実装することができました。
引用返信 削除キー/
■33182 / inTopicNo.4)  Re[3]: FTPサーバー内を全削除する方法
□投稿者/ たに 一般人(3回)-(2015/11/18(Wed) 03:41:27)
  • アイコン今回、FTPサーバーで下層まですべて削除するというサンプルをどうしても探しきれなかったため、完全ではありませんが同じような悩みを持った方の一助になればと自力で作成した内容を投稿します。
    ※ソースは持ち帰りができないのと、会社から掲示板をみることはできても投稿ができない為、自宅から記憶を頼りに書いています。
     所々誤記があるかもしれません。

    Dim WorkFolder As string = "ftp://IPアドレス/指定ディレクトリー名/"
    Dim dirUri As string = New URI(WorkFolder)
    Dim DirFolder(1999) As string
    Dim ListCnt(2) As Integer
    ListCnt(2) = 1999
    Me.ftpCredential = (Id,Pass)

    GetList(dirUri,DirFolder,ListCnt)  ※ディレクトリのリストを配列に格納 
    FolderDelet(dirUri)         ※指定ディレクトリで下層のサブディレクトリも全削除



    Private Sub GetList(ByVal WorkFolder As String, ByVal DirFolder As String(), ByVal ListCnt As Integer())

    Dim dirUri As string = New URI(WorkFolder)
    Dim ftpReq As System.Net.FtpWebRequest
    Dim ftpRes As System.Net.FtpWebResponse

    ftpReq = DirectCast(System.Net.WebRequest.Create(dirUri),System.Net.FtpWebRequest)
    ftpReq.KeepAlive = True
    ftpReq.Credentials = Me.ftpCredential
    ftpReq.Method = System.Net.WebRequest.Methods.Ftp.ListDerectory

    Try
    ftpRes = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse) 
    Using ListTarget As New System.IO.StreamReader(ftpRes.GetResponseStream())
    While True
    Dim line = ListTarget.ReadLine()
    If line Is Nothing Then
    Exit While
    End If
    DirFolder(LineCnt(0)) = dirUri & line & "/" ※ディレクトリリストを絶対パスにして配列に格納(末尾の"/"はディレクトリとして認識させるため)
    LineCnt(0) += 1
    End While
    End Using

    While LineCnt(1) < LineCnt(2)
    If DirFolder(LineCnt(1)) Is Nothing Then
    Exit While
    End if
    GetList(DirFolder(LineCnt(1)),DirFolder,ListCnt)    ※配列を頭から順番に再帰
    LineCnt(1) += 1
    End While

    Catch Er as WebException

    FileDelete(DirFolder(LineCnt(1)))               ※ディレクトリリストが存在しなければファイルなのでファイル削除処理

    End Try

    End Sub

    'ファイル削除
    Private Sub FileDelete(ByVal WorkFolder As String)

    Dim WorkDir As string = WorkFolder.SubString(0, WorkFolder.Length - 1) ※末尾の"/"を除外
    Dim dirUri As string = New URI(WorkDir)
    Dim ftpReq As System.Net.FtpWebRequest = _
    DirectCast(System.Net.WebRequest.Create(dirUri),System.Net.FtpWebRequest)
    ftpReq.Credentials = Me.ftpCredential
    ftpReq.Method = System.Net.WebRequest.Methods.Ftp.FileDelete
    Dim ftpRes As System.Net.FtpWebResponse = _
    CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)

    End Sub

    'ディレクトリ一括削除(ファイルは全削除済み)
    Private Sub FolderDelet(ByVal WorkFolder As String)

    Dim dirUri As string = New URI(WorkFolder)
    Dim ftpReq As System.Net.FtpWebRequest = _
    DirectCast(System.Net.WebRequest.Create(dirUri),System.Net.FtpWebRequest)
    ftpReq.Credentials = Me.ftpCredential
    ftpReq.Method = System.Net.WebRequest.Methods.Ftp.ReMoveDelete
    Dim ftpRes As System.Net.FtpWebResponse = _
    CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)

    End Sub
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -