1

Base64文字列をPDFファイルに変換し、保存してから開こうとする次のコードがあります。

//Converts the Base64 data to bytes
byte[] bytes = Convert.FromBase64String(Base64String);

//Stores the converted Base64 data in the application's Local Resource directory, in PDF format
StorageFolder folder = ApplicationData.Current.LocalFolder;
string fileName = file.pdf";
CreationCollisionOption options = CreationCollisionOption.FailIfExists;

var file = await folder.CreateFileAsync(fileName, options);
var fs = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
var outStream = fs.GetOutputStreamAt(0);
var dataWriter = new Windows.Storage.Streams.DataWriter(outStream);
dataWriter.WriteBytes(bytes);
await dataWriter.StoreAsync();
dataWriter.DetachStream();
await outStream.FlushAsync();

string pdfPath = folder.Path + "\\" + fileName;

StorageFile fileToLaunch = await StorageFile.GetFileFromPathAsync(pdfPath);
await Windows.System.Launcher.LaunchFileAsync(fileToLaunch);

ファイルをAdobeReaderで開くと、ファイルがまだ別のアプリケーションで使用されていることを示すメッセージが表示されます。アドビがファイルを開くことができるように、アプリケーションでファイルを「リリース」するにはどうすればよいですか?これはWindows8アプリであることに注意してください。

4

2 に答える 2

3

これが問題だと思います:

var outStream = fs.GetOutputStreamAt(0);

IOutputStream拡張IDisposableしますが、ストリームを破棄していません。コードのそのセクションを次のように変更してみてください。

using (var outStream = fs.GetOutputStreamAt(0))
{
    var dataWriter = new Windows.Storage.Streams.DataWriter(outStream);
    dataWriter.WriteBytes(bytes);
    await dataWriter.StoreAsync();
    dataWriter.DetachStream();
    await outStream.FlushAsync();
}
于 2013-02-23T15:08:32.423 に答える
1

コードを次のように変更する必要がありました。

        var file = await folder.CreateFileAsync(fileName, options);

        using (var fs = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
        {
            using (var outStream = fs.GetOutputStreamAt(0))
            {
                using (var dataWriter = new Windows.Storage.Streams.DataWriter(outStream))
                {
                    dataWriter.WriteBytes(bytes);
                    await dataWriter.StoreAsync();
                    dataWriter.DetachStream();
                    await outStream.FlushAsync();
                }
            }
        }
于 2013-02-23T15:27:25.557 に答える