Files
duplicati/Duplicati/Library/Compression/FileArchiveDirectory.cs
T
kenneth@hexad.dk 65c320c22d Rewrite of the way the compression modules are used.
The number of methods required by the ICompression interface is now reduce and all handling of path conversion and text encoding is now done in the CompressionWrapper class. This should make it easier to implement a new compression module, and reduce the number of errors that occur because of filename/encoding issues.

This commit also contains a fix for reporting a sane error message if the compression module is not found/loaded.

git-svn-id: https://duplicati.googlecode.com/svn/trunk@1417 59da171f-624f-0410-aa54-27559c288bec
2012-08-07 17:42:09 +00:00

148 lines
5.5 KiB
C#

#region Disclaimer / License
// Copyright (C) 2011, Kenneth Skovhede
// http://www.hexad.dk, opensource@hexad.dk
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using Duplicati.Library.Interface;
namespace Duplicati.Library.Compression
{
/// <summary>
/// This class exposes a local directory as a file archive.
/// Used only internally for debugging, cannot be used as a storage method.
/// </summary>
public class FileArchiveDirectory : ICompression
{
string m_folder;
/// <summary>
/// Constructs a new FileArchive
/// </summary>
/// <param name="basefolder">The folder to base the archive on</param>
public FileArchiveDirectory(string basefolder)
{
m_folder = Utility.Utility.AppendDirSeparator(basefolder);
}
#region IFileArchive Members
/// <summary>
/// Unsupported filename extension property, throws a MissingMethodException
/// </summary>
public string FilenameExtension { get { throw new MissingMethodException(); } }
/// <summary>
/// Unsupported displayname property, throws a MissingMethodException
/// </summary>
public string DisplayName { get { throw new MissingMethodException(); } }
/// <summary>
/// Unsupported description property, throws a MissingMethodException
/// </summary>
public string Description { get { throw new MissingMethodException(); } }
/// <summary>
/// Unsupported supported commands property, throws a MissingMethodException
/// </summary>
public IList<ICommandLineArgument> SupportedCommands { get { throw new MissingMethodException(); } }
/// <summary>
/// Returns a list of files in the archive
/// </summary>
/// <param name="prefix">An optional prefix that is used to filter the list</param>
/// <returns>A filtered list of filenames</returns>
public string[] ListFiles(string prefix)
{
if (prefix == null) prefix = "";
return Utility.Utility.EnumerateFiles(System.IO.Path.Combine(m_folder, prefix)).ToArray();
}
/// <summary>
/// Opens the file for reading
/// </summary>
/// <param name="file">The name of the file</param>
/// <returns>A stream with the file contents</returns>
public System.IO.Stream OpenRead(string file)
{
return System.IO.File.OpenRead(System.IO.Path.Combine(m_folder, file));
}
/// <summary>
/// Creates a new empty file
/// </summary>
/// <param name="file">The name of the file to create</param>
/// <param name="lastWrite">The time the file was last written</param>
/// <returns>The stream used to access the file</returns>
public System.IO.Stream CreateFile(string file, DateTime lastWrite)
{
string path = System.IO.Path.Combine(m_folder, file);
System.IO.Stream res = System.IO.File.Create(path);
//TODO: This should actually be set when closing the stream
System.IO.File.SetLastWriteTime(path, lastWrite);
return res;
}
/// <summary>
/// Returns a value that indicates if the file exists
/// </summary>
/// <param name="file">The name of the file to test existence for</param>
/// <returns>True if the file exists, false otherwise</returns>
public bool FileExists(string file)
{
return System.IO.File.Exists(System.IO.Path.Combine(m_folder, file));
}
/// <summary>
/// Gets the current size of the archive
/// </summary>
public long Size
{
get { return Utility.Utility.GetDirectorySize(m_folder, null); }
}
/// <summary>
/// Gets the last write time for a file
/// </summary>
/// <param name="file">The name of the file to query</param>
/// <returns>The last write time for the file</returns>
public DateTime GetLastWriteTime(string file)
{
return System.IO.File.GetLastWriteTime(System.IO.Path.Combine(m_folder, file));
}
/// <summary>
/// The size of the current unflushed buffer
/// </summary>
public long FlushBufferSize { get { return 0; } }
#endregion
#region IDisposable Members
/// <summary>
/// Disposes the instance
/// </summary>
public void Dispose()
{
m_folder = null;
}
#endregion
}
}