Serializuję obiekt do zmiennej json, która przyjmuje wartość {"CurrentBook":null,"Books":[]}. Następnie gdy wywołuję metodę WriteAsync(...) metoda jest wykonywana a zawartość pliku się nie zmienia; nie wyrzuca żadnych wyjątków. Chodzi o metodę async Task Save().
Kolejność wykonywania:
- Przy starcie wywoływana jest metoda Load() inicjalizowany jest "configStream" i "configModel"
- W pewnym momencie działania programu wywołuję Save()
public class Config : IDisposable, ISubscriber
{
const FileOptions fileOptions = FileOptions.Asynchronous | FileOptions.SequentialScan;
const int fileBufferSz = 4096;
string backupFilePath = Constants.Assets.Files.Config + "~backup";
FileStream configStream;
JObject configContent;
AppConfig configModel;
.
.
.
public async Task Save()
{
try
{
using (var backupFileStream = new FileStream(
backupFilePath,
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.Read,
fileBufferSz,
fileOptions))
{
backupFileStream.SetLength(0);//clear old content
await CopyStreamAsync(configStream, backupFileStream,
default(CancellationToken), fileBufferSz
);
}
File.SetAttributes(backupFilePath, FileAttributes.Hidden);
configStream.SetLength(0);//clear old content
string json = JsonConvert.SerializeObject(configModel);//json = {"CurrentBook":null,"Books":[]}
var byteContent = Encoding.UTF8.GetBytes(json);
await configStream.WriteAsync(byteContent, 0, Encoding.UTF8.GetByteCount(json));// <-- Nie zapisuje wartosci do pliku
}
#if (DEBUG)
catch(Exception e)
{
}
#else
//@TODO
#endif
}
public async Task Load()
{
if (configStream == null)
OpenFile();
if (configStream.Length == 0)//is empty?
{
configContent = null;
configModel = new AppConfig();//create empty config model
return;
}
byte[] result = new byte[configStream.Length];
await configStream.ReadAsync(result, 0, (int)configStream.Length);
configContent = JObject.Parse(Encoding.UTF8.GetString(result));
this.configModel = configContent.ToObject<AppConfig>();
}
void OpenFile()
{
if (File.Exists(backupFilePath))//is backup existing?
{
//@TODO
}
if (!(File.Exists(Constants.Assets.Files.Config)))
{
File.Create(Constants.Assets.Files.Config);//create empty file
}
configStream = new FileStream(
Constants.Assets.Files.Config,
FileMode.Open,
FileAccess.ReadWrite,
FileShare.Read,
fileBufferSz,
fileOptions);
}
}
AppConfig:
[Serializable]
public class AppConfig
{
public AppConfig()
{
this.CurrentBook = null;
this.Books = new List<Book.Book>();
}
public string CurrentBook;//MD5
public List<Book.Book> Books;
}