CodeChops
CodeChops

Reputation: 2058

Unable to delete a file with DeleteAsync

I'm working in VS2012, WinRT and C#.

I'm trying to delete some files after decompressing them. I'm getting an "Access is denied" error. If I stop the app and re-start it the same code works fine so it appears there is a handle still attached.

If I don't call the unZipFile method, I can delete the files.

Is there a definitive way to release a file? I've set it to null (file = null;) before the call to delete.

Here's the block of code that calls the unzip method:

    StorageFile file = await CreateOutputFile(fileName, path);

        MemoryStream theMemStream = new MemoryStream();

        theMemStream.Write(bytes, 0, bytes.Length);

        await FileIO.WriteBytesAsync(file, bytes);

        await theMemStream.FlushAsync();
        theMemStream.Dispose();

        var result = await unZipFile(file, path);

        file = null;

Here's the unZipFile method:

        private async Task<string> unZipFile(StorageFile file, string path)
        {

        StorageFolder sf = await GetOutputFolder(path);

    using (var zipStream = await file.OpenStreamForReadAsync())
    {
        using (MemoryStream zipMemoryStream = new MemoryStream((int)zipStream.Length))
        {

            await zipStream.CopyToAsync(zipMemoryStream);

            try
            {
                var archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path);

                foreach (var entry in archive.Entries)
                {
                    entry.WriteTo(zipMemoryStream);

                    Stream fileData = entry.OpenEntryStream();

                    StorageFile outputFile = await sf.CreateFileAsync(entry.FilePath, CreationCollisionOption.ReplaceExisting);

                    using (Stream outputFileStream = await outputFile.OpenStreamForWriteAsync())
                    {
                        await fileData.CopyToAsync(outputFileStream);
                        await outputFileStream.FlushAsync();
                        outputFileStream.Dispose();
                    }
                }
                archive = null;
            }
            catch (Exception ex)
            {
                throw new IOException("Error writing decompressed output file: " + ex.Message);
            }

            await zipStream.FlushAsync();
            zipStream.Dispose();

            await zipMemoryStream.FlushAsync();
            zipMemoryStream.Dispose();
        }
    }

    return "success";
}

Here's the delete method. This is called for each file after decompression:

private async Task<string> deleteFile(string path, string filename)
{
    StorageFolder folder = await GetOutputFolder(path);

    var files = await folder.GetFilesAsync();

    foreach (StorageFile file in files)
    {
        try
        {
            if (file != null)
            {
                if (file.Name == filename)
                    await file.DeleteAsync();
            }
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
    return "success";
}

Upvotes: 2

Views: 3557

Answers (1)

CodeCaster
CodeCaster

Reputation: 151672

On what file do you get the exception, the extracted files or the zip archive itself?

If the latter is the case, ArchiveFactory.Open() returns an IArchive which inherits IDisposable, so you should wrap var archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path); in a using block so it gets disposed after use.

Upvotes: 3

Related Questions