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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Q&A

解決済

2回答

1878閲覧

ファイル書き込みを中断

yulico

総合スコア14

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

0グッド

0クリップ

投稿2020/06/09 23:53

前提・実現したいこと

StreamWriterでファイルを書き込んでいる最中にEscキーなどで中断したいです。

中断しない場合は、MessageBoxを出力して、ウェブブラウザにデータを投げたいので、
同期で書き込みを行っています(HTMLを生成してます)。
よって、非同期で処理するという選択肢はありません。

良い方法があればご教授下さいませ。

(自分では情報を探せませんでしたが、既出であれば申し訳ありません)

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

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

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

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

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

Zuishin

2020/06/10 00:06 編集

ファイルの書き込み中に入力をチェックする以外に方法がありますか? StreamWriter ということはテキストデータですよね? 一行書き込むごとにチェックすればいいように思いますが、何にひっかかっているのでしょうか?
退会済みユーザー

退会済みユーザー

2020/06/10 00:37

何故そんなことがしたいのか、そもそもの目的、全体のシナリオを描いた方が的確なレスが付きやすい気がします。(XY 問題になっているのではと疑ってます)
yulico

2020/06/10 00:42

返信有難う御座います 質問が足りませんでした 出力用の変数(lines)に、全データを入力していて、その変数をWriteLine(lines)していますので 行を分けることが出来ないのです・・・ linesは、少しでもファイルサイズを節約するために、CRLFを入れていませんので、行に分ける事が出来ません・・・ 1行ずつ書き出すようにした方が、良いでしょうか・・・
Zuishin

2020/06/10 00:46 編集

一行しか書かないならそれほど時間はかからないので中断しなくていいでしょう。書き込んでからチェックすればいいと思います。 書き込み用データの作成に時間がかかるなら、そこでチェックすればいいでしょう。
yulico

2020/06/10 00:48

書いている内容が、数百ページにも及ぶ伝票データのHTMLを1行にいますので サイズ的には5MByteとかになりますので、ほぼ確実にビジーの状態となります・・・
退会済みユーザー

退会済みユーザー

2020/06/10 00:49

> linesは、少しでもファイルサイズを節約するために、CRLFを入れていませんので、行に分ける事が出来ません・・・ 改行コードを入れれば解決するなら入れれば良いのでは? その程度のことで節約になるなんて考え方はおかしいと思うのですが。 それよりなにより、その前に中断など考えずに一気に書き込んでしまった方が良いのでは? リソースの節約とか、ファイルがロックされて困るとかがなくなるかもしれませんし。
退会済みユーザー

退会済みユーザー

2020/06/10 00:57

> サイズ的には5MByteとかになりますので、ほぼ確実にビジーの状態となります・・・ やり始めて途中で何かほかのことをしなければならなくなった場合などビジー状態では困るので処理は中断したいということがそもそもの目的ですか? だとすると、やはり XY 問題&本末転倒のように思うのですが?
yulico

2020/06/10 01:18 編集

書出時に、読込むデータを間違ってしまった事に気が付いたときなどに中断したい事があります > 改行コードを入れれば解決するなら入れれば良いのでは? そうですね、改行コードで行分けするように、対策してみたいと思います
退会済みユーザー

退会済みユーザー

2020/06/10 01:19 編集

大きいデータについては基本的に小分けで書きこむもので、一回で送るものではないです。中断については、ちょうど似たような質問があったこちらが参考になると思います。https://teratail.com/questions/268987
退会済みユーザー

退会済みユーザー

2020/06/10 01:18

> 読込むデータを間違ってしまった事に気が付いたときなどに中断したい事があります 間違わないような仕組みを組み込む・・・なんてことはもうやっているのでしょうね? そもそも 5MB 程度のテキストをファイルに書き込むのにそれほど時間がかかるとは思えないのですが。途中で間違っていることに気付いて中断するコマンドを発行する前に終わってしまうのではないですか。 質問者さんのケースではどのぐらいの時間がかかるのですか。待てないほど長いとするとどこかにボトルネックがあってそれを解決するという話が先と思うのですが、そういうことは検討済み?
退会済みユーザー

退会済みユーザー

2020/06/10 01:20

確かに5Mだとそんなに掛からなさそうですよね。ディスクがめちゃくちゃ遅いとかそんな環境かな…
yulico

2020/06/10 01:26

主に、長いと感じる時は、データが20MB程になっている時ですね ボトルネック解決につきましては、SuferOnWwwさんに言われるまで気が付きませんでした(汗 radianさんにも指摘されてますし、自分でも同様に思えましたので、小分け書込みでやり直します
退会済みユーザー

退会済みユーザー

2020/06/10 01:30

読み書きのバッファ量で速度かわったりするので、その辺も見た方がいいですね(小さすぎると遅い) 速攻で終わるのなら中断する必要もない訳ですし
YAmaGNZ

2020/06/10 01:34

どうせMessageBoxを表示するんですから、書き込み後に送信する時にユーザーに問い合わせするだけで終わる話のような気がします。
guest

回答2

0

ベストアンサー

ある程度のサイズごとに分けて書き込みを行い、そのたびに入力のチェックを行い、ESCが入力されていれば、書き込みを中断する、ということになりますね

投稿2020/06/09 23:56

y_waiwai

総合スコア87749

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

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

yulico

2020/06/10 00:44

返信有難う御座います やはり、小分けにしないと、途中にチェックを入れることが出来ないのですね・・・・ ん~、困った・・・
y_waiwai

2020/06/10 00:49

非同期で書き込みさせて、表でESCキーチェックでもいいですが、どのみち中断させるためには小分けでチェックしないといけませんね。 まあ、スレッドの強制削除ってテもないこともないですが、ファイル書き込み途中でそれやると、なにかわるいよかんがします
yulico

2020/06/10 01:13

返信有難う御座います > ファイル書き込み途中でそれやると、なにかわるいよかんがします そうですね、悪い予感しかしないですねw
guest

0

書き込むべきデータを小分けにして、1行ずつ書出す様に修正したいと思います

投稿2020/06/10 01:28

yulico

総合スコア14

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

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

退会済みユーザー

退会済みユーザー

2020/06/10 01:37 編集

かえって時間がかかって本末転倒ということになるような気がしますが? それに分けるという話はすでに y_waiwai さんが回答されてます。ホントに分けることが解決になるなら、そちらにベストアンサーを付けるべきでは?
yulico

2020/06/10 01:44

そうなんですが、そもそも時短の為に改行コードを抜いたり、一括書き込みの方法をとっていたので・・・ ですが、中断可能な仕様に変更するとなると、1行書出ししかなさそうだし、自分でも思いつきません・・・
YAmaGNZ

2020/06/10 01:48

そもそも、現在データの書き込みにどれくらいの時間がかかっているのですか? そこまで待ち時間がないのであれば、書き込みが終わった後に出すMessageBoxで「本当に送信しますか?」といった感じで問い合わせして、そこでキャンセルでもいいのではないですか?
Zuishin

2020/06/10 01:58

書き込みではなくデータの作成に時間がかかってそうですね。
yulico

2020/06/10 01:59

いつも時間がかかっている訳ではありません データ量が多い時期がありまして、その時期のデータが大きい時に、長い時は30分とか掛かります。 とにかく「中断は出来るのか?」の一点が知りたくて質問させて頂きましたが、 ここまで状況説明とか必要なんだと思い知りました
yulico

2020/06/10 02:02

SurferOnWwwさん > そちらにベストアンサーを付けるべきでは? すみません・・・ この掲示板の使用方法がよく分かっておらず、ベストアンサーせずに解決してしまいました(汗 今から出来るのでしょうか・・・ 出来るのなら、ベストアンサーしたいです(泣
YAmaGNZ

2020/06/10 02:02

そうなると、書き込むデータの作成~書き込みまでをTaskとして、キャンセルできるようにしたほうがいいのではないかと思います。
Zuishin

2020/06/10 02:05 編集

データ作成中にメモリが足りなくてスワップしてる可能性もあります。 「特殊で推奨できない方法を使わなければ中断はできません」という回答でいいなら話は別ですが、根拠や代替案を出すには細かい情報が必要です。次回はイエスノーだけでいいならそう書いてください。
yulico

2020/06/10 02:09

Yahoo!知恵袋さんや、他の質問サイトを見て、いつも、 「みんな聞いてないことまで答えてるなぁ」 「自分は○○を知りたくて質問してるのに、代案とか要らないんだよ!」 と、正直思っていましたが、回答する側の事情を全く考慮していませんでした(汗 そうですよね・・・ そう答える根拠とか必要ですよね・・・ 次回からは、Yes or No だけでいい場合は、そう書くようにします。 失礼しました
Zuishin

2020/06/10 02:14

ただし回答者に資格は必要無いので、誰でも回答できます。イエスノーだけだと両方の回答がつくと思ってください。 この質問の場合、普通の方法では中断できないが、絶対できないわけではないので、両方正解です。
退会済みユーザー

退会済みユーザー

2020/06/10 02:18

> 「みんな聞いてないことまで答えてるなぁ」 > 「自分は○○を知りたくて質問してるのに、代案とか要らないんだよ!」 Teratail は技術者同士の情報交換の場ということで、あなた専用の Q&A の場ではなさそうです。質問者と回答者のやり取りを通じて、質問者の課題に対するより良い解決策を探すということも可能だと自分は思っています。
yulico

2020/06/10 02:27

> 質問者の課題に対するより良い解決策を探すということも可能 この意見に賛同し、わたしも情報交換の場である事を胸に、今後とも利用していきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問