質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

6373閲覧

ファイル一括削除時にエラーが出る。

yuki00079

総合スコア45

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/09/28 04:36

###前提・実現したいこと
vb.netにて対象のUSB(Mドライブ)内のファイルを全て削除する処理の実装を考えております。
実装後、テストをしている段階で削除できるものとエラーが出るデバイスがあり困っております。

###発生している問題・エラーメッセージ

"パス 'M:\FileInfo2.dat' へのアクセスが拒否されました。"
上記の文面のエラーが出るのですが、実際のデバイスには該当のファイルが存在しません。(隠しファイルでもなかった。)

###該当のソースコード

Directory.EnumerateFiles("M:\").ToList().ForEach(AddressOf File.Delete)

###試したこと
Try CatchでSystem.UnauthorizedAccessException例外を無視も考えましたが、その場合その他ファイルも削除されず当方の理想としている処理が行えません。
可能であれば一行、ループをまわさずアクセス許可されたもののみ削除できたらと考えております。

###補足情報(言語/FW/ツール等のバージョンなど)
.net4.0 VB14

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

対症療法的な記述になってしまうので、個人的にも「とりあえず例外をcatchして無視」というのは好きではないですが、

vbnet

1Try 2 Directory.EnumerateFiles("M:\").ToList().ForEach(AddressOf File.Delete) 3Catch (e As UnauthorizedAccessException) 4End Try

ではなく

vbnet

1For Each file In Directory.EnumerateFiles("M:\") 2 Try 3 File.Delete(file) 4 Catch (e As UnauthorizedAccessException) : End Try 5Next

とすれば動かすだけなら大丈夫だと思います。
コードを拝見すると、M:ルート直下のファイルだけを削除、という感じですかね?

もしもドライブのファイルをすべて削除するのが目的なら、クイックフォーマットの方が素早く確実かな、という気もします。
C#でディスクフォーマット - TUYSラボ

参考URLはC#なのでVB.NETとして読み直すとこんな感じでしょうか。

vbnet

1<DllImport("fmifs.dll", CharSet:=CharSet.Auto, EntryPoint:="FormatEx")> 2Private Shared Sub FormatEx( 3 driveLetter As String, mediaFlag As Integer, 4 fsType As String, label As String, quickFormat As Integer, 5 clusterSize As Integer, callBackDelegate As FormatCallBackDelegate) 6End Sub 7 8Private Delegate Function FormatCallBackDelegate( 9 callBackCommand As CallbackCommand, 10 subActionCommand As Integer, action As IntPtr) As Integer 11 12Private Enum CallbackCommand 13 PROGRESS 14 DONEWITHSTRUCTURE 15 UNKNOWN2 16 UNKNOWN3 17 UNKNOWN4 18 UNKNOWN5 19 INSUFFICIENTRIGHTS 20 UNKNOWN7 21 DISKLOCKEDFORACCESS 'UNKNOWN8 22 UNKNOWN9 23 UNKNOWNA 24 DONE 25 UNKNOWNC 26 UNKNOWND 27 OUTPUT 28 STRUCTUREPROGRESS 29End Enum

投稿2016/09/28 06:22

htsign

総合スコア870

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/09/28 07:30

返信ありがとうございます。エラーの原因が判明し、Directory.EnumerateFilesの際に隠しファイル、またはシステムファイルをリスト化し削除しようとしたのが原因のようです。いただいた回答で実装できましたがせっかくなのでLinqにての実装を目指しているのですがうまく実装できません。Linqでの実装パターンはどのようなものがございますでしょうか。
htsign

2016/09/28 07:46

.ForEach(AddressOf File.Delete) の箇所を .ForEach(Sub(f) Try File.Delete(f) Catch (e As UnauthorizedAccessException) : End Try End Sub) とすることでLinqとなります。 ただ、インデントが深くなって見づらくなると思いますよ。
yuki00079

2016/09/28 07:54

現在下記のコードでトライしているのですが実装にはいたっておりません。 Directory.EnumerateFiles("M:\"). Where(Function(f) 'Notファイル属性が隠しまたはシステムファイル).ToList().ForEach(AddressOf File.Delete) ↑これだとtry Catchを消せそうなのですが。
htsign

2016/09/28 08:42

そうですね。 仰る通り、例外となるパターンを事前に排除すれば簡潔に書ける可能性があります。 その代わりWhereに渡す Func(Of String, Boolean) がやたら長くなるかもしれません(^^;
yuki00079

2016/09/29 03:55

特定のファイル属性を無視することで解決いたしました。 ご助言いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問