DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FTPサーバーのディレクトリ削除

環境/言語:[Vista VB.net ]
分類:[.NET]

間違ってコンテンツの方に投稿しました。すみません。再投稿です。

本サイトのFTPサーバーのファイルやディレクトリ削除についてお教えください。

 ・ファイルについては正常に削除されましたが、ディレクトリについては
  エラーとなりました。エラーメッセージは下記の通りです。

  リモート サーバーがエラーを返しました: (550)
  ファイルが使用できません (例: ファイルが見つからない、
  ファイルへのアクセスがない)

 ディレクトリを thum とした時、下記をどのように修正すればよいのか
お教えください。よろしくお願いします。

Dim u As New Uri("ftp://localhost/test.txt")

'FtpWebRequestの作成
Dim ftpReq As System.Net.FtpWebRequest = _
CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
'ログインユーザー名とパスワードを設定
ftpReq.Credentials = New System.Net.NetworkCredential("username", "password")
'MethodにWebRequestMethods.Ftp.DeleteFile(DELE)を設定
ftpReq.Method = System.Net.WebRequestMethods.Ftp.DeleteFile

'FtpWebResponseを取得
Dim ftpRes As System.Net.FtpWebResponse = _
CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)

'FTPサーバーから送信されたステータスを表示
Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
'閉じる
ftpRes.Close()
http://dobon.net/vb/dotnet/internet/ftpwebrequest.html#deletefile

に書いてあるとおり、「"RMD"コマンドを送信してディレクトリを削除する時は、MethodプロパティにWebRequestMethods.Ftp.RemoveDirectoryを指定」してください。

また、エラーの原因を調べたいときは、まずはスローされた例外の中身を確認してみてください。WebExceptionがスローされているならば、そのResponseプロパティのStatusDescriptionプロパティなどを見てみてください。
■No25438に返信(管理人さんの記事)
> http://dobon.net/vb/dotnet/internet/ftpwebrequest.html#deletefile
>
> に書いてあるとおり、「"RMD"コマンドを送信してディレクトリを削除する時は、MethodプロパティにWebRequestMethods.Ftp.RemoveDirectoryを指定」してください。
>
> また、エラーの原因を調べたいときは、まずはスローされた例外の中身を確認してみてください。WebExceptionがスローされているならば、そのResponseプロパティのStatusDescriptionプロパティなどを見てみてください。

最初にやった時もWebRequestMethods.Ftp.RemoveDirectoryを指定したのですが、
今回は下記のようなエラーがまた出ました。

WebExceptionはハンドルされませんでした。
リモート名を解決できませんでした。: 'binam77.ie-yasu.com'

ファイル削除は問題なく、削除できたのですが、フォルダの場合はどうしても
エラーになります。エラーがでても解析する力が私にはありません。
どうも実力不相応の事をやろうとしているようです。残念ですが実力がないの
ですから仕方ありません。
掲示板を汚したようで申し訳ありません。これで終わらせていただきたいと
思います。
■No25439に返信(binさんの記事)
>>> リモート サーバーがエラーを返しました: (550)
RemoveDirectory 時に 550 (FtpStatusCode.ActionNotTakenFileUnavailable) が
発生する要因としては、下記のような物が考えられます。

・空っぽでは無いディレクトリを削除しようとした(空で無いと削除できない FTP サーバーの場合)。
・指定するパスを間違えていた。
・削除のための権限が不足している。
・サーバー側の異常(ディスクアクセスエラー等)。


> 最初にやった時もWebRequestMethods.Ftp.RemoveDirectoryを指定したのですが、
> 今回は下記のようなエラーがまた出ました。
前回は「リモート サーバーがエラーを返しました: (550)」という
エラーですよね。今回の実行にあたり、何を変更されましたか?


> WebExceptionはハンドルされませんでした。
> リモート名を解決できませんでした。: 'binam77.ie-yasu.com'
接続先は、'localhost' であったはずですよね。
>> Dim u As New Uri("ftp://localhost/test.txt")
それなのに、'binam77.ie-yasu.com' が参照されるのは妙ですね。

コードと環境のどちらに問題があるのか、見極める必要がありそうです。


> これで終わらせていただきたいと思います。
なお当方環境では、下記のコードで testDirectory ディレクトリの作成と破棄が行えました。
(接続先の FTP サーバーは、IIS 6.0 です)


'Imports System.Net
'Imports System.IO

Dim ftpReq As FtpWebRequest
Dim credentials As New NetworkCredential(username, password)

Console.WriteLine("ファイル一覧を取得 (NLST/ListDirectory)")

ftpReq = DirectCast(WebRequest.Create("ftp://server/"), FtpWebRequest)
ftpReq.Credentials = credentials
ftpReq.KeepAlive = True
ftpReq.Method = WebRequestMethods.Ftp.ListDirectory
Using ftpRes As FtpWebResponse = DirectCast(ftpReq.GetResponse(), FtpWebResponse)
    Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
    Using response As New System.IO.StreamReader(ftpRes.GetResponseStream())
        Console.WriteLine(response.ReadToEnd())
        response.Close()
    End Using
    ftpRes.Close()
End Using

Console.WriteLine("ディレクトリ[testDirectory]を作成 (MKD/MakeDirectory)")
ftpReq = DirectCast(WebRequest.Create("ftp://server/testDirectory"), FtpWebRequest)
ftpReq.Credentials = credentials
ftpReq.KeepAlive = True
ftpReq.Method = WebRequestMethods.Ftp.MakeDirectory
Using ftpRes As FtpWebResponse = DirectCast(ftpReq.GetResponse(), FtpWebResponse)
    Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
    ftpRes.Close()
End Using

Console.WriteLine("ディレクトリ[testDirectory]を削除 (RMD/RemoveDirectory)")

ftpReq = DirectCast(WebRequest.Create("ftp://server/testDirectory"), FtpWebRequest)
ftpReq.Credentials = credentials
ftpReq.KeepAlive = False
ftpReq.Method = WebRequestMethods.Ftp.RemoveDirectory
Using ftpRes As FtpWebResponse = DirectCast(ftpReq.GetResponse(), FtpWebResponse)
    Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
    ftpRes.Close()
End Using


---------- FTP サーバー側の通信ログ ----------
#Fields: time cs-method cs-uri-stem sc-status sc-win32-status 
14:09:25 [1]USER username 331 0
14:09:25 [1]PASS - 230 0
14:09:25 [1]CWD / 250 0
14:09:30 [1]MKD testDirectory 257 0
14:09:32 [1]RMD testDirectory 250 0
14:09:32 [1]QUIT - 250 0
----------------------------------------
■No25441に返信(魔界の仮面弁士さんの記事)
> RemoveDirectory 時に 550 (FtpStatusCode.ActionNotTakenFileUnavailable) が
> 発生する要因としては、下記のような物が考えられます。
>
> ・空っぽでは無いディレクトリを削除しようとした(空で無いと削除できない FTP サーバーの場合)。

 削除できました。!!!!!!
 FFFTP(アップロード用ソフト)を使って空のフォルダを binam77.ie-yasu.
com にアップして実験すると、削除出来ました。出来なかったのは空フォルダ
ではなかったためだとわかりました。

 ファイルをフォルダに格納し、DeleteFile でファイルを削除し、ついで
RemoveDirectory でフォルダ削除という実験も正常に動作しました。

 ということは、フォルダを削除するためには、フォルダを取得し、そこから
ファイル削除を行い、ついでフォルダ削除ということですね。

 仮面弁士さんのいつもながらの丁寧にご指導に感謝しております。
 どうも有り難うございました。
 
 
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板