1

所以,下面的代码允许我拍照。然后我显示图片。我的 XAML 绑定到对象的Photo属性Vehicle。它工作正常,直到我进入并尝试再次拍照。然后我得到一个UnauthorizedAccessException. 我在“LocalStorage”中创建文件,所以我认为我不需要特殊权限来在那里写入文件。我不确定是什么导致了错误。

public async Task TakePicture()
    {
        CameraCaptureUI camera = new CameraCaptureUI();
        camera.PhotoSettings.CroppedAspectRatio = new Size(16, 9);
        StorageFile photo = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);

        if (photo != null)
        {
            var targetFolder = ApplicationData.Current.LocalFolder;
            var targetFile = await targetFolder.CreateFileAsync(String.Format
                ("VehiclePhoto{0}.jpg", this.Vehicle.PrimaryKey), CreationCollisionOption.ReplaceExisting);
            if (targetFile != null)
            {
                await photo.MoveAndReplaceAsync(targetFile);
                this.Vehicle.Photo = String.Format("ms-appdata:///local/VehiclePhoto{0}.jpg", this.Vehicle.PrimaryKey);
            }
        }
    }
4

1 回答 1

2

我假设它StoragePhoto在引擎盖下封装了某种文件 I/O。您必须正确处置这些对象,以释放将“挂钩”保留在文件中的底层非托管操作系统资源。如果您不处置它们,应用程序将保持对文件的访问处于打开状态,这可能就是您对文件的第二次访问给您带来异常的原因(第一次访问仍然存在)。给我看 StoragePhoto 代码,我可以得到更具体的信息。

另一方面,如果此应用程序是多线程的,您应该在将文件写入磁盘时创建粒度信号量/锁(可能通过实习物理路径字符串并锁定该引用),以确保您不会尝试编写相同的同时在相同的物理路径上将文件写入磁盘 - 那会很糟糕。

于 2013-06-28T21:25:28.683 回答