• 締切済み

VB.NETでの特殊なファイル削除操作

VB.NETでの特殊なファイル削除操作 フォルダ内に以下例のような撮影された画像ファイル群があり、各ファイル名は撮影時間を元に(年月日_時分秒_ミリ秒)名前付けされたもので、この同じ「秒」内に撮影された2枚目以降のファイルを、プログラム的に削除したいのですが、上手くいきません。 フォルダ内のファイル 20100709_135601_113.jpg 20100709_135601_222.jpg 20100709_135601_316.jpg 20100709_135601_364.jpg 20100709_135602_347.jpg 20100709_135602_425.jpg 20100709_135603_910.jpg 20100709_135605_175.jpg 20100709_135605_251.jpg 20100709_135606_628.jpg 例えば、一番上の13時56分01秒には、4枚撮影されたjpgファイルがありますが、最初に撮影された「20100709_135601_113.jpg」 だけを残し 残りの 「20100709_135601_222.jpg」 「20100709_135601_316.jpg」 「20100709_135601_364.jpg」 のファイルを消し、1秒1ファイルだけにしたいのです。 そしてこの結果を 20100709_135601_113.jpg 20100709_135602_347.jpg 20100709_135603_910.jpg 20100709_135605_175.jpg 20100709_135606_628.jpg としたいのです。 なお、このjpgファイルを作成する側のアプリは触れません。 こちら側のプログラムで、削除処理を行いたいです。 ファイル名定義もこのままです。 135604のように、秒内で存在しないjpgファイルも存在します。 どなたか、よいお知恵をお貸し下さいませ。 どうぞよろしくお願いします。 (WinXP Vb.NET2010)

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

VB.NETが特に得意なら別ですが、エクセルVBAでも出来ます。 気が乗らなければ無視してください。 あるフォルダ内のファイル名をエクセルシートのA列のセルに書き出す。 これはGoogleでDir関数やFSOのコード例が沢山在る。「VBA フォルダ ファイル名 全て」で照会 例 データ 書き出し後 20100709_135601_113.jpg 20100709_135601_222.jpg 20100709_135601_316.jpg 20100709_135601_364.jpg 20100709_135602_347.jpg 20100709_135602_425.jpg 20100709_135603_910.jpg 20100709_135605_175.jpg 20100709_135605_251.jpg 20100709_135606_628.jpg A列でソート。これもVBAで出来るが手動が確実。 処理ロジックは、 A列のデータを全行読むが、読んで直前の行と秒までの同じものはファイル削除する。 直前と秒までの文字列で違うものは削除しない(=残す)。 コード Sub test01() d = Range("A65536").End(xlUp).Row '最下行取得 MsgBox d j = 1 For i = 2 To d If Left(Cells(i, "A"), 15) = Left(Cells(i - 1, "A"), 15) Then 'ファイル削除(コードは下記 '削除明細 Cells(j, "C") = Cells(i, "A") j = j + 1 End If Next i End Sub ーー 削除明細は、C列に 20100709_135601_222.jpg 20100709_135601_316.jpg 20100709_135601_364.jpg 20100709_135602_425.jpg 20100709_135605_251.jpg ーー ファイル削除のコードは 「VBA ファイル 削除」で照会 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_100.html Kill cnsSOUR のところ。

回答No.2

あ、消すやつは逆だった・・・ ということで、     Dim delFileNames As New List(Of String)     For Each fileName As String In fileNames       mfi = New MyFileInfo(fileName)       ' 日付で検索し登録されているか       If dic.ContainsKey(mfi.TimeStamp) Then         ' ミリ秒を比較し、小さければ差し替え         If dic(mfi.TimeStamp).MliliSec > mfi.MliliSec Then           delFileNames.Add(dic(mfi.TimeStamp).FileName)           dic(mfi.TimeStamp) = mfi         Else           delFileNames.Add(fileName)         End If       Else         ' 登録         dic(mfi.TimeStamp) = mfi       End If     Next     ' 全部表示     For Each fileName As String In delFileNames       Console.WriteLine(fileName)     Next こう?

masaokun2
質問者

お礼

たくさん回答ありがとうございました。 以下で望む動作をしてくれるプログラムが組めました。 bluecampusさんimagashiさん、ご教授ありがとうございました。 Dim objFso As Object Dim objFolder As Object Dim objFile As Object Dim lngCount As Long Dim mnm As Object objFso = CreateObject("Scripting.FileSystemObject") objFolder = objFso.GetFolder("D:\") lngCount = 0 mnm = 0 Debug.Print("ファイル数:" & objFolder.Files.Count) For Each objFile In objFolder.Files lngCount = lngCount + 1 If mnm = Mid(objFile.name, 10, 6) Then Kill("D:\" & objFile.Name) Else mnm = Mid(objFile.name, 10, 6) End If Next

回答No.1

何がうまくいかないのかよくわからないけど、自分だったら ファイル名・日付時間(ミリ秒は除く)・ミリ秒のクラスやら構造体とDictionaryを使ってやるかな。 Imports System Imports System.Collections.Generic Module Module1   Class MyFileInfo     Dim fileName_ As String     Dim timeStamp_ As DateTime     Dim miliSec_ As Integer     Public Sub New(ByVal fileName As String)       Me.FileName = fileName       ' _ と . で文字列を分割       Dim token As String() = fileName.Split(New Char() {"_"c, "."c})       ' 0番目の要素は日付、1番目の要素は時間 -> 時間型に変換       Me.TimeStamp = DateTime.ParseExact(token(0) & token(1), "yyyyMMddHHmmss", Nothing)       ' 2番目の要素はミリ秒 -> 数値型に変換       Me.MliliSec = Integer.Parse(token(2))     End Sub     Public Property FileName()     ' 省略     End Property     Public Property TimeStamp()     ' 省略     End Property     Public Property MliliSec()     ' 省略     End Property   End Class   Sub Main()     Dim dic As New Dictionary(Of DateTime, MyFileInfo)     Dim fileNames As String() = _       New String() {"20100709_135601_113.jpg", _              "20100709_135601_222.jpg", _              "20100709_135601_316.jpg", _              "20100709_135601_364.jpg", _              "20100709_135602_347.jpg", _              "20100709_135602_425.jpg", _              "20100709_135603_910.jpg", _              "20100709_135605_251.jpg", _              "20100709_135605_175.jpg", _              "20100709_135606_628.jpg"}     Dim mfi As MyFileInfo     For Each fileName As String In fileNames       mfi = New MyFileInfo(fileName)       ' 日付で検索し登録されているか       If dic.ContainsKey(mfi.TimeStamp) Then         ' ミリ秒を比較し、小さければ差し替え         If dic(mfi.TimeStamp).MliliSec > mfi.MliliSec Then           dic(mfi.TimeStamp) = mfi         End If       Else         ' 登録         dic(mfi.TimeStamp) = mfi       End If     Next     ' 全部表示     For Each mfi In dic.Values()       Console.WriteLine(mfi.FileName)     Next   End Sub End Module ※インデント保持のため全角空白! エラー処理とか考えていないです。 ちなみにVB.NETはほとんど触っていないのでもっといいやり方があるかも。

関連するQ&A

  • VB.NETで出来るファイルについて

    VB.NETの学習書を買って 中に入ってるサンプルを見たんですが 1つのプログラムに対して ファイルがたくさんあって何がなんだがよくわかりません。 各ファイルについて説明してるサイトとか知りませんか? たくさんあっても弄るのって一部だったりするんでしょうか? VBの時もたくさんあるなぁ~程度のひどい認識だったんですが。

  • Visual Basic 6.0について

    Visual Basic 6.0について いまプログラムを組んでいるのですが、どうしても分からない点があるので質問させていただきます。 フォルダに毎日更新したときに追加される「aaaa_20100720123456(年月日時分秒).txt」というファイルがあるとします。(年月日時分秒の部分は更新した時間です。) このファイルをVB6のプログラム内でString型で定義した変数を=で結びたいのです。年月日の部分まではFormat(Now,yyyyMMdd)でいいのですが、時分秒の部分は毎日更新する時間が微妙に違うのでどう書けばいいかが分かりません。 分かりづらいと思いますが、どなたか教えて頂けますか?宜しくお願いします。 このような感じです。 Dim a as String a="aaaa_"+Format(Now,"yyyyMMdd")+(この部分が分かりません)+".txt"

  • VB.NETで指定のURLにファイルを送る事は出来ますか?

    プロバイダーの自分のスペースなどにファイルを 送るプログラムをと思っているのですが、 VB.NETではその様なことは出来るでしょうか? FTPソフトなどを使って行う作業だと思いますが、 それと同じように、IDやパスワードを送信すれば ファイルを受け付けてくれるのでしょうか? まだ出来ればフォルダ(ディレクトリ)を作ったりも出来ると良いのですが。 VB.NETの何と言うものを使用するのか教えて頂けると助かります。 宜しくお願いします。

  • 全てのjpgファイルを一つ上の階層に移動したいです

    ネットワークカメラの設定で年月日時分秒を利用してjpgファイルが 以下の様にUPされます。 ./www/hoge/20160309/19/194512_1.jpg ./www/hoge/20160309/19/194512_2.jpg ./www/hoge/20160309/20/203317_1.jpg ./www/hoge/20160309/21/214055_1.jpg ./www/hoge/20160310/07/070503_1.jpg ./www/hoge/20160310/07/082235_1.jpg 時間だけを表している2桁数字のフォルダが邪魔なので、jpgファイル 全てを一括で一階層上の年月日8桁の数字フォルダ内に移動するには、 どのように記述すれば良いかご教示お願いします。 ネットワークカメラは24時間作動しているので、手動で移動するのは 面倒です。どうぞ宜しくお願いします。

  • VB.netでAccess操作

    タイトル通り、VB.netでAccessを操作するプログラムを作っています。 項目が、『番号』『氏名』『選択科目1』『選択科目2』 VBのフォーム上にAccessのファイルに登録されている全てのデータを取り出して二次元配列のように表示させます。 ボタンは編集、削除、行追加です。 編集 --- このボタンを押すとAccessに反映 削除 --- このボタンを押すとチェックボックスにチェックされた行が削除される 行追加 --- このボタンを押すと、表示されているデータの下に一行分、行が追加され、そこから入力できるようになる 私はtextboxを動的に配置して、textboxを二次元配列で処理できるようにプログラムを組んでみたのですが 何だか上手なプログラムが組めなくなってしまいまして困っているところです・・・。 仕様には、登録データ分だけの行数が表示されなくてはいけないと書いてあります。 つまり削除がある時点で、一行分を削除するためにはtextboxを消さなくてはいけなくなってしまいました。 (ex データが四件あるとして、その時点ではtextbox(0,0) ~ textbox(3,3)    ですが、一件削除するとtextbox(0,0)~textbox(2,3)になり  textbox(3,0)textbox(3,1)textbox(3,2)textbox(3,3)を削除しなければいけない) 非表示ではなく、textboxコントロール自体を削除したいのですが、そんな方法はあるのでしょうか? それともこのプログラムの組み方は間違った方法なのでしょうか? VB.net初心者のため、未だにどんなコントロールを使えばうまく処理できるのか分かっていないところがありますので、 どんな些細なことでもお気づきのことがありましたら、教えてください。 自分だったらこんな機能や処理をする!ということもお待ちしております。 宜しくお願いします。

  • VB.NETでフォルダを圧縮

    VB.NETでフォルダ(ファイル)を圧縮するプログラムを作っています。 http://homepage1.nifty.com/rucio/main/Samples/Sample057LhaPress.htm このページのやり方が一番簡単だと思ったのですが、 VB6のコードなので使えません。 どうすればVB.NETで使えるでしょうか。

  • 作成してから○○日以上経過したファイルを削除したい

    いつもお世話になっています。 現在VC++で5分おきにファイルが自動生成されるプログラムを作っています。 ファイル名は年月日時分秒をつけています。20080306100500、20080306100000など。 この処理に、あるタイミングで現時点より2日(48時間)以上前のファイルはすべて削除する処理を加えたいと考えています。 現時点より○○日以上前もしくは○○時間以上前というのは、どのように判別したら良いかで詰まっています。 何か良い条件の書き方等ありましたら、教えていただけると助かります。

  • 削除できないファイル

    こんにちは。 削除できないファイルがあり、困っています。 Local Setting\Temporary Internet FIles\Content.IE5 の中にある、indexというファイルです。 削除しようとすると「indexを削除できません、ほかの人またはプログラムによって使用されています。ファイルを使用している可能性があるプログラムをすべて閉じてから、やり直してください」と表示されます。 ファイルの種類は、InterVideo Media Fileとなっています。 しかし、開いても何も再生されません。 同じフォルダ内には、ネットで閲覧したHPの画像等が幾つものフォルダに分かれて保存されています。(このフォルダは消去できます。) どうしたら、削除できるのでしょうか? 回答、宜しくお願い致します。

  • VB.NETでフォルダの一覧を更新する方法

    VB.NETでフォルダの一覧を更新する方法について質問させて下さい。 現在ネットワーク上の共有フォルダのファイルの更新日付を監視するソフトをVB.Netで作成したのですが 実際にはファイルが更新されているのに更新されたとソフトで認識するまでに1分くらいタイムラグ が発生します。 監視するのは 「IO.File.GetLastWriteTime」 という関数で監視しています。 そこで エクスプローラのメニューには「最新の情報に更新」というメニューが存在しますが VB.Netでプログラム的に「最新の情報に更新」を実行させる方法はないでしょうか? よろしくお願いいたします。

  • 初心者ですアドバイスお願いします

    ウェブカメラを使い画像をフォルダに保存しているのですが、 困った事がありまして投稿させて頂きました。 出来る画像ファイル名 年日時分秒01.jpg 例えば今日の1時15分45秒だと 2005101113154501.jpgです。 この様な画像ファイルが、 5秒おきにフォルダに作成されて行きます。 (たまにカメラが落ちるので秒にバラツキも出ます。 この条件下で質問したい事があるのですが、 5秒おきに作成される膨大な画像ファイルを 1時間1枚残し残りは全削除したいのです。 使っているOSはLInux3.2です 良い方法等ありましたらアドバイスお願いします

専門家に質問してみよう