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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

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

解決済

3回答

824閲覧

VB.NETのバージョン管理で、実行ファイルのフォルダ内のファイル名が固定ではない場合の取得方法を教えてください。

PotePui

総合スコア69

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

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クリップ

投稿2018/11/07 14:22

表題の件で困っているところが下記のコードになります。
正規表現を使えばできるのかなと思っています。

Dim test1 As String = System.IO.Path.GetFileName(System.IO.Directory.GetCurrentDirectory + "test_v" + "^[0-9][.0-9]$" + ".xlsx") Console.WriteLine(test1) 結果 test_v^[0-9][.0-9]$.xlsx

test1の文字列に、
実行ファイルが格納されているファイルパスを取得し、
その格納ファイル内の「test_v1.01.xlsx」のようなファイル名に直接バージョン管理をしている際の
このファイルパスの取得方法があれば、教えてください。

System.IO.Directory.GetCurrentDirectory : exeファイルが格納されているフォルダパスを取得
System.IO.Path.GetFileName("A.xlsx") : "A.xlsx"ファイル名と拡張子のパスを取得

上記のv_2.00など、ファイル名が変更する場合、
"^[0-9][.0-9]$"このような正規表現方法で、実現できないかと考えています。

ただ、現在では、
結果にある通り、正規表現が使えていない?かなと思っています。

やりたいこととしては、
今後v_1.05でもv3.03でもv5.00でも好きなヴァージョでのファイル名を記載しても、
そのファイルのパスを取得することです。

よろしくお願いいたします

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

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

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

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

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

guest

回答3

0

ベストアンサー

前提として、
・バージョン番号は数字のみで、メジャー・マイナーのみが設定されている。
(「v○.○○」の形式)
・バージョン番号は、メジャー・マイナー番号ともに1個以上の数字である。
(v10.01等も考慮して)
・対象フォルダーには必ず「test_v○.○○.xlsx」の形式のファイルが存在する。
・対象フォルダー内の「test_v○.○○.xlsx」名ファイルは1つである。
(仮に複数あった場合であってもどれか一つが抽出される。)

の条件であれば、以下の方法で、対象フォルダ内の「test_v○.○○.xlsx」のファイル名を取得できます。

1.対象フォルダ内の「test_v*.xlsx」に該当するファイルを検索する。
2.上記1.の結果の中で、「test_v○.○○.xlsx」の形式にマッチするファイルを選択する

そのコードは、例えば以下の通りとなります。
≪補足≫
RegEx.Matchの第3引数を追加して大文字・小文字を無視するようにしました。
(ファイル名の大文字・小文字はWindows側では区別しないため)

VB.NET

1Imports System.IO 2Imports System.Text.RegularExpressions 3'↑それぞれDirectoryクラスとRegexクラスの名前空間です。 4 5'(クラス定義は省略) 6 7 Private Function GetVerExcelFileName() As String 8 Dim verFile As String = Nothing 9 For Each f As String In Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory(), "test_v*.xlsx") 10 If Regex.IsMatch(Path.GetFileName(f), "test_v[0-9]+.[0-9]+.xlsx", RegexOptions.IgnoreCase) Then 11 Return f 12 End If 13 Next 14 15 Return Nothing 16 17 'Linqを使って1行で書くとこんな感じ(.Netのバージョンによって書き方が変わるかも知れない) 18 'Return (From f As String In Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory(), "test_v*.xlsx") _ 19 ' Where Regex.IsMatch(Path.GetFileName(f), "test_v[0-9]+.[0-9]+.xlsx")).FirstOrDefault 20 End Function

なお、exeのあるパスを取得する際にDirectory.GetCurrentDirectory()を使わなかったのは、作業フォルダーの変更があると、これがexeのあるパスを指さない場合があるためです。

投稿2018/11/08 06:14

編集2018/11/08 09:48
kenshirou

総合スコア772

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

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

PotePui

2018/11/15 11:10

ありがとうございます! すごく勉強になりました。 頂きました回答で、ちゃんと動くこともできました^^ 本当にありがとうございます!
guest

0

dim path as string = IO.Path.Combine(Application.StartupPath,"test_v[0-9][.0-9].xlsx") dim m as match = System.Text.RegularExpressions.Regex.Match (path) Console.WriteLine(m.value)

該当するファイルが複数存在する場合など、色々考慮していませんが。

投稿2018/11/08 02:55

mdj

総合スコア220

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

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

PotePui

2018/11/15 11:12

ありがとうございます。 こちらも試してみました。 色々と方法があるんですね。 この方法でもできそうと思ってやってみました。 該当するファイルは複数ある場合ではないので、こちらもすごくいいと思って高評価させていただきました^^ ありがとうございます。
guest

0

C#のコード例になってしまいますが、こんな感じでいけると思います。
Linqを使って、正規表現で一致するファイル名を、test1の変数に格納しています。
また、正規表現が一部謝っていましたので、一部修正しました。

c#

1using System.Linq; 2using System.IO; 3using System.Text.RegularExpressions; 4 5var test1 = Directory.GetFiles(Directory.GetCurrentDirectory()) 6 .Select(p => Path.GetFileName(p)) 7 .FirstOrDefault(f => Regex.IsMatch(f, "test_v[0-9]\.[0-9]+\.xlsx"));

投稿2018/11/07 15:10

teramon3333

総合スコア102

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

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

PotePui

2018/11/15 11:13

C#も表現が似ているので、すごく助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問