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

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

ただいまの
回答率

91.87%

  • VB.NET

    544questions

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

VB.NETでファイルコピーのツールを作成したい

解決済

回答 3

投稿 2016/03/16 09:50 ・編集 2016/03/16 09:52

  • 評価
  • クリップ 0
  • VIEW 917

yyy

score 36

前提・実現したいこと

VB.NETでファイルコピー、移動させるツール作成をしています。
以下のことをしたいのですが、うまく動きません。
1.更新日時の取得(当てはまる日にちのみ抽出したい)
2.ファイル名の取得(あるフォルダ内の該当ファイルのみを別場所のフォルダに移動させたい)
3.以上の条件に合ったファイルのみを別フォルダに移動させる

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

・ループで該当フォルダの中を回したいが、諸々の取得箇所(書く位置)がわからない。
・2でディレクトリには移動できない旨のメッセージ(そもそもファイル名の取得が間違っているのだと思いますが)

ソースコード

VB.NET

Imports System.IO

Public Class Form1

    Private Property FILE_PATH As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = 
        TextBox2.Text = 
        TextBox3.Text = "*.DAT"
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'ファイル名の取得
        Dim oFile As New FileInfo(TextBox1.Text)
        Dim FileName As String
        FileName = oFile.Name

        '更新日時の取得
        Dim dtUpdate As New System.IO.FileInfo(TextBox1.Text)

        '該当ファイル件数が0になるまでループ
        Do Until

            If FileName = TextBox3.Text And
                dtUpdate = TextBox4.Text Then

                'ファイルコピー元と貼り付け先を指定
                My.Computer.FileSystem.CopyFile(TextBox1.Text, TextBox2.Text)

            End If

        Loop

    End Sub

End Class

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

フォームに
・コピー元
・貼り付け先
・ファイル名
・更新日時
を入力するTextBoxがあり、便宜上クリックイベントで更新日時以外は自動入力されるようにしています。

できれば該当ファイルのみでループを回したいのですが、そのようなことは可能でしょうか。

また、ネットで調べて持ってきたコードをつなぎ合わせたようになっているので波線も既に出ている状態です。

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

TextBox1:移動元ディレクトリ
TextBox2:移動先ディレクトリ
TextBox3:対象ファイル
TextBox4:対象日付

と仮定してアドバイスさせていただきます。

1.更新日時の取得(当てはまる日にちのみ抽出したい) 

FileInfoは更新日付そのものではなく、ファイル情報を提供してくれるものです。
更新日付はFileInfo.LastWriteTimeプロパティで取得できます。

2.ファイル名の取得(あるフォルダ内の該当ファイルのみを別場所のフォルダに移動させたい) 

「ファイル一覧 VB.NET」で検索すると参考になるサイトがいろいろ出てきます。

たとえば参考⇒
http://hensa40.cutegirl.jp/archives/820

3.以上の条件に合ったファイルのみを別フォルダに移動させる

「移動」であればFile.Moveでできると思います。

以上をまとめて、

Dim strMsg As String

    Dim strFromDir As String = TextBox1.Text    ' 検索するディレクトリ
    Dim strToDir As String = TextBox2.Text      ' 移動先ディレクトリ
    Dim strSearchFile As String = TextBox3.Text ' 検索するファイル

    '対象ファイルを検索する>
    Dim fileList As String() = Directory.GetFileSystemEntries(strFromDir, strSearchFile)

    '抽出したファイル数
    strMsg = ("file num = " + fileList.Length.ToString())

    '抽出したファイルをループ処理
    For Each filePath As String In fileList
        'ファイル情報を取得
        Dim oFile As New FileInfo(filePath)
        '取得ファイルのパス
        strMsg = strMsg & vbCr & ("file path = " + filePath)
        '取得ファイルの更新日
        strMsg = strMsg & vbCr & ("file date= " + oFile.LastWriteTime)
        strMsg = strMsg & vbCr

        If Format(oFile.LastWriteTime, "yyyy/MM/dd") = TextBox4.Text Then
            'ファイルの移動(フルパスからディレクトリ名を除去することでファイル名部分を取得しています)
            File.Move(oFile.FullName, strToDir & oFile.FullName.Replace(oFile.DirectoryName, ""))
        End If
    Next

    MsgBox(strMsg)


以上のような処理で実現できると思います。


あと、技術的なアドバイスとして、
①提示いただいたコードは日付判定の条件文が2行にまたがっていましたが、
VBでは1命令が複数行にまたがるとき、各行を _ でつなげる必要があります。

If FileName = TextBox3.Text And _
            dtUpdate = TextBox4.Text Then



②いろいろな部分がうまく動作していない場合、できるだけ小さくテストして
ひとつづつ解決していくことをお勧めします。
(変数名なども可能であれば固定値で動作させ、できるケースとできないケース、エラー内容を把握する)

My.Computer.FileSystem.CopyFile("C:\Hoge.dat", "C:\Temp\Hoge.dat")

がんばってみてください。

投稿 2016/03/16 11:04

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/03/16 13:31

    本筋とは関係ないですが・・・

    If FileName = TextBox3.Text _
    And dtUpdate = TextBox4.Text Then

    だと行末に _ が要りますが、

    If FileName = TextBox3.Text And
    dtUpdate = TextBox4.Text Then

    ならいらない気がします。
    文法的に、続きがある場合は _ なしでもOK?
    (古い版だと _ ないと怒られたような気もしますが)

    ----------
    …気になったのでぐぐったら

    > VB2010以降では、カンマ(,)の後などでは、行継続文字を省略できるようになりました。

    だそうです。

    キャンセル

  • 2016/03/17 09:29

    なるほど、自分の普段使いがVS2005だったので気が付きませんでした(^-^;

    ご指摘ありがとうございます!

    キャンセル

  • 2016/03/28 14:58 編集

    遅くなりまして大変申し訳ございません。

    ご丁寧な回答、アドバイスありがとうございます。非常にわかりやすく、助かりました。
    先ほど勘違いしてレコードが足りないと書いてしまったのですが、訂正いたします。
    正しく取得できました!

    ループを入れたら勝手にファイル名を見てきてくれるのかと思っていたのですが’対象ファイルを検索’しないとならないのですね…。
    まだ、メソッド等理解できていないところが多々ありますので、細かな部分を調べて理解に努めます。
    ありがとうございました!

    キャンセル

0

「File.Copy(コピー元ファイルのPath, コピー先ファイルのPath)」とかじゃだめですかね?
File Copy メソッド(String, String) | MSDN

投稿 2016/03/16 09:58

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/03/16 10:19

    FileCopyだとまさに”ディレクトリには移動できない旨のメッセージ”がでるので使えませんでした。

    キャンセル

0

ここが参考になると思いますが
http://dobon.net/vb/dotnet/file/filecopy.html

念のため「My.Computer.FileSystem.CopyFile(TextBox1.Text, TextBox2.Text)」の
「TextBox1.Text」と「TextBox2.Text」に「フルパス&ファイル名」になっているかブレークポイントで確認してみてはどうでしょう

投稿 2016/03/16 10:47

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

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

ただいまの回答率

91.87%

関連した質問

同じタグがついた質問を見る

  • VB.NET

    544questions

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

閲覧数の多いVB.NETの質問