2017-06-14 7 views
-1

私はメインプログラミング言語としてC#でUnityでゲームをしています。私は新しいsave.txtとautosave.txtを作成しようとしています。作成することはできますが、正しくは機能しません。ここに私のコードです: 作成と書き込み新しい保存:c#とUnityでtxtファイルを作成して書き込むときには、それを作成して使用しません。

void Start() { 
    if(!File.Exists(Application.dataPath.ToString() + "/Save.txt")) 
    { 
     File.CreateText(Application.dataPath.ToString() + @"/Save.txt"); 
     saveFilePath = Application.dataPath.ToString() + @"/Save.txt"; 

     TextWriter writer = new StreamWriter(saveFilePath, false); 
     writer.WriteLine("10:21:59", "13/06/2017", "1", "1", "-21", "20000", "100", "500", "50", "20", "500","2","1","1","5000", "10"); 
     writer.Close(); 

    } 
    if(!File.Exists(Application.dataPath.ToString() + "/AutoSave.txt")) 
    { 
     File.CreateText(Application.dataPath.ToString() + @"/Autosave.txt"); 
     saveFilePath = Application.dataPath.ToString() + @"/Autosave.txt"; 

     TextWriter writer = new StreamWriter(saveFilePath, false); 
     writer.WriteLine("00:00:00", "01/01/2017", "1", "1", "-21", "20000", "100", "500", "50", "20", "500", "2", "1", "1", "5000", "10"); 
     writer.Close(); 
    } 
} 

をここに私は存在しない.txtのコード書いている:

public void OnSaveGame() 
{ 
    saveFilePath = Application.dataPath.ToString() + @"/Save.txt"; 
    isNewGame = false; 

    TextWriter writer = new StreamWriter(saveFilePath, false); 
    theTime = System.DateTime.Now.ToString("hh:mm:ss"); theDate = System.DateTime.Now.ToString("dd/MM/yyyy"); 
    string ZeroPart = theTime + "," + theDate + ","; 
    string FirstPart = income; 
    writer.WriteLine(ZeroPart + FirstPart); 
    writer.Close(); 

    SavingPanel.SetActive(true); 
    Invoke("WaitTime",2); 



} 

を私が間違って何をすべきか分かりません。 P.P. 「IOException:パスC:* \ Assets \ Save.txtの共有違反」というメッセージが表示されたら、それが役に立ちます。

答えて

0

@ b00nと@martennisの両方の答えは、彼らに少し真実がありますが、少し欠けています。 StreamWriterオブジェクトがストリームを閉じるだけでファイルを作成しても、そのファイルに施されているロックは解放されません。したがって、新しいストリームが古いファイルによってロックされているため、新しいストリームがアクセスを取得できなかったため、そのファイルにアクセスするための新しいStreamWriterを作成すると、IOExceptionがスローされます。ストリームを閉じてそれを破棄することで、ストリームが後で読むためにファイルを解放するのに必要な適切なクリーンアップを実行できるようになります。私は非常にMSDN上のFile APIのドキュメントを提供することをお勧めしますどのように機能し、どのように動作するかについてのより良い理解を得るために読んでください。

EDIT:StreamWriterオブジェクトをクリーンアップする方法の1つは、usingステートメントを@Oとして使用することです。マテイは言いました。それは、次の線に沿って何かのようになります。writer.Dispose()がfinally文で呼び出されると

using(TextWriter writer = new StreamWriter(saveFilePath, false)) 
{ 
    theTime = System.DateTime.Now.ToString("hh:mm:ss"); theDate = System.DateTime.Now.ToString("dd/MM/yyyy"); 
    string ZeroPart = theTime + "," + theDate + ","; 
    string FirstPart = income; 
    writer.WriteLine(ZeroPart + FirstPart); 
    writer.Close(); 
} 

usingステートメントは、基本的に同等であるのtry-catch-最終的に確保することであっても例外であれば使用されたリソースが適切にクリーンアップされていたことが判明しました。

2

File.CreateTextはStreamWriterオブジェクトを返します。このオブジェクトを使用していない(または新しいライターをファイルに作成する前に破棄しない)ため、複数のオブジェクトにそのファイルへの書き込みアクセス権があり/必要であるため、例外がスローされます。

IDisposableと 'using'ステートメントの詳細については、こちらをご覧ください。

1

新しいStreamWriterを作成する代わりに、File.CreateText()が返すStreamWriterを使用してみます。

関連する問題