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

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

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

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

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

解決済

1回答

4914閲覧

FileStreamでWriteAsyncを利用したファイルの書き込みについて

punineko

総合スコア11

C#

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

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

0クリップ

投稿2018/07/19 03:19

ファイルのアップロードするプログラムを作成しているのですが、
ファイルアップロードはできるのですがファイルが壊れてしまって開けない状態になってしまいます。

下記ソースでファイルはできるのですが壊れています。
よろしくお願いします。

var stream = Request.InputStream; //1mbづつアップされる。
var position = Int32.Parse(Request.Headers["ChunkPosition"]);

var bytes = ReadToEnd(InputStream);

if (bytes.Length > 0)
{
using (FileStream fs = new FileStream(_path, FileMode.Open, FileAccess.Write, FileShare.Write, bytes.Length, true))
{
fs.Seek(position, SeekOrigin.Begin);
fs.WriteAsync(bytes, 0, bytes.Length);
}
}

public static byte[] ReadToEnd(System.IO.Stream stream) { long originalPosition = 0; if (stream.CanSeek) { originalPosition = stream.Position; stream.Position = 0; } try { byte[] readBuffer = new byte[4096]; int totalBytesRead = 0; int bytesRead; while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) { totalBytesRead += bytesRead; if (totalBytesRead == readBuffer.Length) { int nextByte = stream.ReadByte(); if (nextByte != -1) { byte[] temp = new byte[readBuffer.Length * 2]; Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); readBuffer = temp; totalBytesRead++; } } } byte[] buffer = readBuffer; if (readBuffer.Length != totalBytesRead) { buffer = new byte[totalBytesRead]; Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); } return buffer; } finally { if (stream.CanSeek) { stream.Position = originalPosition; } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1using (FileStream fs = new FileStream(_path, FileMode.Open, FileAccess.Write, FileShare.Write, bytes.Length, true)) 2{ 3 fs.Seek(position, SeekOrigin.Begin); 4 fs.WriteAsync(bytes, 0, bytes.Length); 5}

WriteAsyncは、非同期にファイル書き込みを行うものなので、メソッド自体は即座に終了します
書き込みが始まらない/終わらないうちにFilestreamがCloseされるため、ファイルは壊れてしまいます

投稿2018/07/19 03:24

y_waiwai

総合スコア87749

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

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

punineko

2018/07/19 03:41

ご回答ありがとうございます。 非同期で1mbづつファイルを書き込む処理になっております。 最初のpositionに開始位置が入ってきて1mbづつファイルに書き込みすることになっています。
y_waiwai

2018/07/19 03:58

ふつーにWriteでいいんじゃないでしょうか
punineko

2018/07/19 04:10

fs.Write(bytes, 0, bytes.Length); にしてもファイルが壊れていました。 ということはストリームで送られてくるところで壊れている可能背のほうが大きいですかね。
punineko

2018/07/19 04:16

2mbのファイルを書き込む際にバイナリを確認すると前半1mb分が空っぽになっていまいた。
YAmaGNZ

2018/07/19 04:24

受信したものをそのままそれぞれファイルへ書き込み(1.tmp、2.tmp って感じ)、全受信終了後に再構築(copy 1.tmp + 2.tmp 受信ファイル名)すればいいのでは?
y_waiwai

2018/07/19 04:35

書き込むデータがどうなってるか確認しましょう。 そこのWriteのせいで壊れるってことはないはずです
punineko

2018/07/19 05:08

ご回答ありがとうございます。 前任者が毎回ファイルを作成するロジックにしており ファイルの中身が消して書き込むという感じになっておりました。 ファイルサイズは指定されたサイズで作成されるため気づきませんでした。 皆様ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問