#region Disclaimer / License
// Copyright (C) 2015, The Duplicati Team
// http://www.duplicati.com, info@duplicati.com
//
// 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
//
using System.Linq;
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using Duplicati.Library.Interface;
using Duplicati.Library.IO;
namespace Duplicati.Library.Compression
{
///
/// This class exposes a local directory as a file archive.
/// Used only internally for debugging, cannot be used as a storage method.
///
public class FileArchiveDirectory : ICompression
{
string m_folder;
///
/// Constructs a new FileArchive
///
/// The folder to base the archive on
public FileArchiveDirectory(string basefolder)
{
m_folder = Util.AppendDirSeparator(basefolder);
}
#region IFileArchive Members
///
/// Unsupported filename extension property, throws a MissingMethodException
///
public string FilenameExtension { get { throw new MissingMethodException(); } }
///
/// Unsupported displayname property, throws a MissingMethodException
///
public string DisplayName { get { throw new MissingMethodException(); } }
///
/// Unsupported description property, throws a MissingMethodException
///
public string Description { get { throw new MissingMethodException(); } }
///
/// Unsupported supported commands property, throws a MissingMethodException
///
public IList SupportedCommands { get { throw new MissingMethodException(); } }
///
/// Returns a list of files in the archive
///
/// An optional prefix that is used to filter the list
/// A filtered list of filenames
public string[] ListFiles(string prefix)
{
if (prefix == null) prefix = "";
return Utility.Utility.EnumerateFiles(System.IO.Path.Combine(m_folder, prefix)).ToArray();
}
///
/// Returns a list of files in the archive
///
/// An optional prefix that is used to filter the list
/// A filtered list of filenames
public IEnumerable> ListFilesWithSize(string prefix)
{
if (prefix == null) prefix = "";
List> res = new List>();
foreach(string s in Utility.Utility.EnumerateFiles(System.IO.Path.Combine(m_folder, prefix)))
res.Add(new KeyValuePair(s, new System.IO.FileInfo(s).Length));
return res;
}
///
/// Opens the file for reading
///
/// The name of the file
/// A stream with the file contents
public System.IO.Stream OpenRead(string file)
{
return System.IO.File.OpenRead(System.IO.Path.Combine(m_folder, file));
}
///
/// Creates a new empty file
///
/// The name of the file to create
/// A hint to the compressor as to how compressible the file data is
/// The time the file was last written
/// The stream used to access the file
public System.IO.Stream CreateFile(string file, CompressionHint hint, 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;
}
///
/// Returns a value that indicates if the file exists
///
/// The name of the file to test existence for
/// True if the file exists, false otherwise
public bool FileExists(string file)
{
return System.IO.File.Exists(System.IO.Path.Combine(m_folder, file));
}
///
/// Gets the current size of the archive
///
public long Size
{
get { return Utility.Utility.GetDirectorySize(m_folder, null); }
}
///
/// Gets the last write time for a file
///
/// The name of the file to query
/// The last write time for the file
public DateTime GetLastWriteTime(string file)
{
return System.IO.File.GetLastWriteTime(System.IO.Path.Combine(m_folder, file));
}
///
/// The size of the current unflushed buffer
///
public long FlushBufferSize { get { return 0; } }
#endregion
#region IDisposable Members
///
/// Disposes the instance
///
public void Dispose()
{
m_folder = null;
}
#endregion
}
}