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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

6141閲覧

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

honeorizon

総合スコア1

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿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 のインスタンスを作成して使用するとエラーを回避出来ると聞いてやってみたけど同じエラーが出ました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

fsの方もcloseしましょう

投稿2022/11/01 01:11

y_waiwai

総合スコア87719

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

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

honeorizon

2022/11/01 07:08 編集

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

2022/11/01 12:28 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問