🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

Q&A

解決済

2回答

3558閲覧

ファイルへの書き込み時に動作が停止してしまう

gaki14

総合スコア24

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

0グッド

0クリップ

投稿2019/10/15 09:18

前提・実現したいこと

UWPで取得した筆圧値をテキストファイルに出力する機能を作成したいのですが,
ビルドエラーは出ないが実行直後にすぐエラーが出てしまいます.
停止してしまう理由を教えていただきたいです.

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

System.Exception: '置換されるファイルを削除できません。 (Exception from HRESULT: 0x80070497)'

該当のソースコード

C#

1private async void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 string temp; 4 // Create sample file; replace if exists. 5 Windows.Storage.StorageFolder storageFolder = 6 Windows.Storage.ApplicationData.Current.LocalFolder; 7 Windows.Storage.StorageFile sampleFile = 8 await storageFolder.CreateFileAsync("いいい.txt", 9 Windows.Storage.CreationCollisionOption.ReplaceExisting); 10 11 for (i = 0; i < 100; i++) 12 { 13 temp = array[i].ToString(); 14 await Windows.Storage.FileIO.WriteTextAsync(sampleFile, temp + "\n"); 15 16 } 17 }

試したこと

いいい.txtファイルがある状態で実行すると止まることもないのですが,txtファイルを開いてみると0が1つ表記されているだけで,筆圧値が表示できていない.

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

UWPには手を出していないので自信はないけれど、
ファイルへの書き込みに関するベスト プラクティスを見る感じ、WriteTextAsyncを実行するとテンポラリファイルを作成してそっちに書き込んでから無事完了後にテンポラリファイルから書き込み対象ファイルへ上書きするような動きになっているのかな?
で、質問文に書いてあるエラーコード(0x80070497)で検索すると

元のファイル (file.txt) が使用中のため、置換できませんでした。 置換の前に、別のプロセスまたは操作でファイルにアクセスされました。

ということなので元ファイルがロックされたままなのでテンポラリファイルからの上書きができていないっぽい
祭hその書き込みだけはまだロックされていなかったから成功して"0"が書かれている状態になっているっぽい
なのでそこでファイルをロックしたままになっているんだと思う
じゃぁどうすれば良いのかっていうと、「ストリームを使用する 4 ステップのモデル」という手法でやりましょうってことなんだと思います

投稿2019/10/15 15:29

len_souko

総合スコア1363

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

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

gaki14

2019/10/21 08:07

回答ありがとうございました.AppendTextAsyncを使用して複数行出力するようにしました.ご丁寧な説明ありがとうございました.
guest

0

ベストアンサー

表題のエラーについてはわからないですがファイルの書き込みが複数行出力できていない部分だけ触れます。

複数行書き込みする場合はWindows.Storage.FileIO.WriteLinesAsyncを利用すると効率的かと思います。

csharp

1private async void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 // Create sample file; replace if exists. 4 Windows.Storage.StorageFolder storageFolder = 5 Windows.Storage.ApplicationData.Current.LocalFolder; 6 Windows.Storage.StorageFile sampleFile = 7 await storageFolder.CreateFileAsync("いいい.txt", 8 Windows.Storage.CreationCollisionOption.ReplaceExisting); 9 10 await Windows.Storage.FileIO.WriteLinesAsync(sampleFile, array.Select(x => x.ToString())); 11 }

あくまでWindows.Storage.FileIO.WriteTextAsyncで書き出すならstring.JoinなりStringBuilderなりを使って出力したい文字列を単一のstringにした上で、いずれにしても一回の書き込みで完了させられればいいのかなと思います。

投稿2019/10/15 22:57

tor4kichi

総合スコア769

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

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

tor4kichi

2019/10/15 22:58 編集

蛇足として、定期的にバッファにためた筆圧値をファイルに追記するような実装にするならAppendLinesAsyncを使ったり、あとは非同期安全に処理させないとアクセスが競合して例外が飛び交うことになりそうなので、それを避けるにはReaderWriterLockやSemaphoreSlim、AsyncLockなどの非同期ロックについて調べて使っていけるといいのかなと思います。
gaki14

2019/10/21 07:12

ご回答ありがとうございました.AppendTextAsyncを使用することで複数行出力の件に関しては解決することができました.ご丁寧にありがとうございましたm(__)m
tor4kichi

2019/10/21 09:35

解決できてよかったですね。 ただ、蛇足コメント部分がベストアンサー理由になってるのはちょっと「おや?」と感じます。 質問をされる際は、エラーそのものだけではなく本来やりたかったことを主旨にして質問すると、良い質問になると思いますし、こちらとしても回答もしやすくなると思います。ご参考までに。
gaki14

2019/10/22 07:50

とても勉強になります. 質問の仕方が良くなかったのですね. 良い回答をもらえるように良い質問ができるよう努めます. ご指摘ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問