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

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

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

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

Q&A

解決済

4回答

4750閲覧

【C#、UWP】Directory.Exists()の結果がInvalidOperationExceptionまたは常にfalseになる

hyubyu-n1

総合スコア28

C#

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

0グッド

0クリップ

投稿2019/10/15 04:36

編集2019/10/15 06:07

#質問
Cドライブ直下にフォルダAppが存在するかどうかをDirectory.Exists()で確認しています。
Microsoft:Directory.Exists(String) Method

C#

1 string path = @"C:\App"; 2 bool hoge = Directory.Exists($"{path}"); 3 Debug.WriteLine($"{hoge}");

これはフォルダの有無にかかわらず「InvalidOperationException」が発生します。

そして「path」のスラッシュを抜いた場合は、

C#

1 string path = @"C:App"; 2 bool hoge = Directory.Exists($"{path}"); 3 Debug.WriteLine($"{hoge}"); 4}

フォルダの有無にかかわらず常にfalseが返ってきます。

パスの書き方がおかしいのでしょうか?詳しい方よろしくお願いします。

[追記]
OS:Windows10
開発環境:VisualStudio2019
UWPアプリ

[追記2]
#自己解決・・・?

C#

1await Task.Run(()=> 2{ 3 string path = @"C:\App"; 4 bool hoge = Directory.Exists($"{path}"); 5 Debug.WriteLine($"{hoge}"); 6});

Directory.Exists()の含まれる箇所全体をTask.Run()で囲むと、
フォルダAppが存在するならtrue、存在しないならばfalseと出力されました。

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

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

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

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

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

alg

2019/10/15 05:15

InvalidOperationException の詳細なエラーメッセージも追記していただけますか?
hyubyu-n1

2019/10/15 05:24

例外がスローされました: 'System.InvalidOperationException' (System.IO.FileSystem.dll の中) 例外がスローされました: 'System.InvalidOperationException' (System.Private.CoreLib.ni.dll の中) これでよいでしょうか?
hyubyu-n1

2019/10/15 06:02

InvalidOperationException発生個所では特にエラーメッセージは出てきませんでした。 そして何故かはまったく理解できていませんが、Directory.Exists()が含まれるコード行すべてをawait Task.Run()で囲むと正常な動作が実現しました。
guest

回答4

0

Windows 10+.NET Framework 4.7.2 のコンソールアプリで試してみましたが、InvalidOperationException は発生しませんでした。
"C:\App" が存在しなければ false になりますし、存在すれば true になりました。

csharp

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string path = @"C:\App"; 6 bool hoge = Directory.Exists($"{path}"); 7 Debug.WriteLine($"{hoge}"); 8 } 9 }

どんな環境で実行していますか?


string path = @"C:App";

こちらはパスの指定の仕方としては正しくないので false が常に返されるのは問題ないと思います。
誤解を招きやすいので、避けたほうがよさそうです。

投稿2019/10/15 05:05

編集2019/10/15 05:31
alg

総合スコア2019

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

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

dodox86

2019/10/15 05:19 編集

> string path = @"C:App"; > こちらはパスの指定の仕方として正しくない 「正しくない」とまでは言えないと思います。カレントディレクトリ扱いになるので、C:ドライブのカレントディレクトリからみて"App"ディレクトリが存在すればtrueが返ります。
alg

2019/10/15 05:20

おや?私の環境では、`string path = @"C:App"` の場合は C:\App があってもなくてもfalseが返されますね。
hyubyu-n1

2019/10/15 05:23

回答ありがとうございます。追記しましたがUWPアプリです。 また、同様のコードを自環境で作成したコンソールアプリで試した結果、正しい結果(存在すればtrue,無ければfalse)が得られました。 UWPではDirectory.Exists()が定義されていない可能性が・・・?と思いドキュメントを確認しましたがUWPも適用対象に含まれていますね(https://docs.microsoft.com/ja-jp/dotnet/api/system.io.directory.exists?view=netframework-4.8)
alg

2019/10/15 05:25 編集

ああ、「カレントディレクトリ扱いになるので」という意味が分かりました。たしかにカレントにAppディレクトリがあればtrueになりました。dodox86さん、ご指摘ありがとうございます。
dodox86

2019/10/15 05:23

プログラム実行時のプログラムから見たカレントディレクトリです。algさんのデバッグ時には、「C:\」を実行時のカレントディレクトリに指定してデバッグすると、C:\Appが存在する限り、trueが返ると思います。
dodox86

2019/10/15 05:25

コメントがすれ違いました。大変失礼しました。「カレントディレクトリ扱い」と言う私の表現がいまいちでした「相対PATH」とでも言えば申せば良いのか。
dodox86

2019/10/15 05:27

重ねての誤記、失礼しました。>「言えば申せば」
alg

2019/10/15 05:32

:)
guest

0

自己解決

#自己解決・・・?(推測)

C#

1//ダメな場合? 2Directory.Exists(パス); 3//→ InvalidOperationExceptionが発生 4 5 6//OKな場合? 7await Task.Run(()=>{ 8 Directory.Exists(パス); 9}); 10//→パスが存在すればtrue、無ければfalseと期待通りの動作になった 11

しかしなぜこうなるのかは不明

投稿2019/10/17 07:43

hyubyu-n1

総合スコア28

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

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

0

UWP ではデフォルトでアクセスできる場所が決まっています。次のリンクに従って権限を取得してください。

その他の場所へのアクセス

投稿2019/10/15 05:40

Zuishin

総合スコア28660

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

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

0

これで試してみてください。

C#

1 string path = @"C:App"; 2 bool hoge = Directory.Exists(path); 3 Debug.WriteLine(path);

投稿2019/10/15 05:01

nskydiving

総合スコア6500

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

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

nskydiving

2019/10/15 06:19

ご指摘ありがとうございます。 どうやら文法の問題ではなさそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問