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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

IOException: Sharing violation on pathというエラーを回避できない(Unity)

honeorizon
honeorizon

総合スコア1

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0グッド

0クリップ

923閲覧

投稿2022/11/01 01:05

セーブをしたあと、一度ゲームを終了して実行し直し、セーブ済みの箇所に上書き保存を試みると以下のエラーが出て操作が効かなくなってしまいます。

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

IOException: Sharing violation on path D:\Users\2012011\Documents\OverWrite\Assets\Data2.json System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at <695d1cc93cca45069c528c15c9fdd749>:0) System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share) (at <695d1cc93cca45069c528c15c9fdd749>:0) (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare) SaveDataManager.Save (System.Int32 dataNumber) (at Assets/Scripts/Save/SaveDataManager.cs:63) Menu+<LoopSave>d__64.MoveNext () (at Assets/Scripts/Menu/Menu.cs:429) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <d3b66f0ad4e34a55b6ef91ab84878193>:0)

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.IO; using System.Text; [Serializable] class SaveData { // アイテム取得フラグを保持 public bool[] S_itemGetFlags; // イベントフラグを保持 public bool[] S_eventFlags; // プレイヤーのステータスを保持 public int[] S_status; // プレイヤーの所持コマンドを保持 public List<Command> S_contents = new List<Command>(); // プレイヤーの座標を保持 public Vector3 S_playerPos; } [Serializable] class SaveDataWrapper { public SaveData[] data = new SaveData[] { new SaveData(), new SaveData(), new SaveData() }; } public class SaveDataManager : MonoBehaviour { [SerializeField, Header("アイテム取得フラグ")] FlagList itemGetFlags; [SerializeField, Header("イベントフラグ")] FlagList eventFlags; [SerializeField, Header("プレイヤーのステータス")] TmpInt status; [SerializeField, Header("プレイヤーのコマンド")] TmpCommand playerCommand; [SerializeField, Header("プレイヤー")] GameObject player; // セーブデータの名前(オブジェクト名)を格納する Vector3 playerPos; SaveDataWrapper wrapper = new SaveDataWrapper(); // 指定したパスにセーブデータを書き出す StreamWriter writer; // 指定したパスからセーブデータを読み出す StreamReader reader; // JSON形式に変換されたデータを格納 string json; // セーブデータへのパスを保持 string pass; FileStream fs; void Awake() { for (int i = 0; i <= wrapper.data.Length - 1; i++) { // 配列の要素数 + 要素の初期化 wrapper.data[i].S_itemGetFlags = new bool[itemGetFlags.Flags.Count]; wrapper.data[i].S_eventFlags = new bool[eventFlags.Flags.Count]; wrapper.data[i].S_status = new int[status.contents.Count]; } } public void Save(int dataNumber) { pass = Application.dataPath + "/Data" + dataNumber + ".json";    // ↓ここでエラー発生 fs = new FileStream(pass, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); //// 値入れ替え処理 //// // リストの要素 + 要素数を初期化 wrapper.data[dataNumber].S_contents.Clear(); // アイテムゲットフラグを格納 for (int i = 0; i <= itemGetFlags.Flags.Count - 1; i++) { wrapper.data[dataNumber].S_itemGetFlags[i] = itemGetFlags.Flags[i].IsFlag; } // イベントフラグを格納 for (int i = 0; i <= eventFlags.Flags.Count - 1; i++) { wrapper.data[dataNumber].S_eventFlags[i] = eventFlags.Flags[i].IsFlag; } // ステータスを格納 for (int i = 0; i <= status.contents.Count - 1; i++) { wrapper.data[dataNumber].S_status[i] = status.contents[i].number; } // 所持コマンドを格納 for (int i = 0; i <= playerCommand.contents.Count - 1; i++) { wrapper.data[dataNumber].S_contents.Add(playerCommand.contents[i]); } wrapper.data[dataNumber].S_playerPos = player.transform.position; // セーブ json = JsonUtility.ToJson(wrapper); writer = new StreamWriter(fs); writer.Write(json); writer.Flush(); writer.Close(); Debug.Log(dataNumber); } public void Load(int dataNumber) { pass = Application.dataPath + "/Data" + dataNumber + ".json"; fs = new FileStream(pass, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); reader = new StreamReader(fs); json = reader.ReadToEnd(); reader.Close(); wrapper = JsonUtility.FromJson<SaveDataWrapper>(json); //// 値入れ替え処理 //// // アイテムゲットフラグを更新 for (int i = 0; i <= itemGetFlags.Flags.Count - 1; i++) { if (wrapper.data[dataNumber].S_itemGetFlags[i]) { itemGetFlags.Flags[i].IsFlag = true; } else { itemGetFlags.Flags[i].IsFlag = false; } } // イベントフラグを更新 for (int i = 0; i <= eventFlags.Flags.Count - 1; i++) { if (wrapper.data[dataNumber].S_eventFlags[i]) { eventFlags.Flags[i].IsFlag = true; } else { eventFlags.Flags[i].IsFlag = false; } } // ステータスを更新 for (int i = 0; i <= status.contents.Count - 1; i++) { status.contents[i].number = wrapper.data[dataNumber].S_status[i]; } // 所持コマンドを更新 for (int i = 0; i <= playerCommand.contents.Count - 1; i++) { playerCommand.contents[i] = wrapper.data[dataNumber].S_contents[i]; } player.transform.position = wrapper.data[dataNumber].S_playerPos; } }

試したこと

FileStream のインスタンスを作成して使用するとエラーを回避出来ると聞いてやってみたけど同じエラーが出ました。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

fs = new FileStream(pass, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);

fsの方もcloseしましょう

投稿2022/11/01 01:11

y_waiwai

総合スコア85997

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2022/11/01 12:25

こちらの回答が他のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

回答へのコメント

honeorizon

2022/11/01 07:08 編集

writer.Close(); の下に fs.Close(); を追加しましたが、IOException: Sharing violation on pathのエラーが出ました。 追記:他のスクリプトにClose()入れてなかっただけでした。解決致しました。
Zuishin

2022/11/01 12:28 編集

StreamReader や StreamWriter をクローズすると元のストリームもクローズされるため、この回答に書いてあることは無関係です。 誤った回答をベストアンサーに選ぶのではなく、自己解決が望ましいです。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。