使用独立存储时“无法找到文件”

时间:2008-09-16 14:04:41

标签: c# .net

我将内容保存在Isolated Storage文件中(使用类IsolatedStorageFile)。它运行良好,我可以从GUI层调用DAL图层中的保存和检索方法时检索保存的值。但是,当我尝试从同一项目中的另一个程序集中检索相同的设置时,它会给我一个FileNotFoundException。我做错了什么?这是一般概念:

    public void Save(int number)
    {
        IsolatedStorageFile storage = IsolatedStorageFile.GetMachineStoreForAssembly();
        IsolatedStorageFileStream fileStream =
            new IsolatedStorageFileStream(filename, FileMode.OpenOrCreate, storage);

        StreamWriter writer = new StreamWriter(fileStream);
        writer.WriteLine(number);
        writer.Close();
    }

    public int Retrieve()
    {
        IsolatedStorageFile storage = IsolatedStorageFile.GetMachineStoreForAssembly();
        IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(filename, FileMode.Open, storage);

        StreamReader reader = new StreamReader(fileStream);

        int number;

        try
        {
            string line = reader.ReadLine();
            number = int.Parse(line);
        }
        finally
        {
            reader.Close();
        }

        return number;
    }

我尝试过使用所有GetMachineStoreFor *范围。

编辑:由于我需要多个程序集来访问文件,因此除非它是ClickOnce应用程序,否则它似乎不可能与隔离存储一起使用。

2 个答案:

答案 0 :(得分:4)

当您实例化IsolatedStorageFile时,您是否将其范围限定为IsolatedStorageScope.Machine?

好了,现在你已经说明了你的代码风格,我已经回去重新测试方法的行为,这里有解释:

  • GetMachineStoreForAssembly() - 作用于计算机和程序集标识。同一应用程序中的不同程序集将拥有自己的独立存储。
  • GetMachineStoreForDomain() - 在我看来是个用词不当。作用于计算机,域标识位于程序集标识之上。应该只有AppDomain的选项。
  • GetMachineStoreForApplication() - 这是您正在寻找的。我测试了它,不同的程序集可以获取另一个程序集中写入的值。唯一的问题是,应用程序标识必须是可验证的。在本地运行时,无法正确确定它,并且最终会出现“无法确定调用方的应用程序标识”的异常。可以通过Click Once部署应用程序来验证它。只有这样,这种方法才能应用并实现共享隔离存储的预期效果。

答案 1 :(得分:1)

保存时,您正在调用GetMachineStoreForDomain,但在检索时,您正在调用GetMachineStoreForAssembly。

GetMachineStoreForAssembly的范围限定为执行代码的程序集,而GetMachineStoreForDomain的范围限定为当前运行的AppDomain和执行代码的程序集。只需将这些调用更改为GetMachineStoreForApplication,它就可以正常工作。

可以在http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile_members.aspx

找到IsolatedStorageFile的文档