private bool ValidateOutput(string basedir, Stream outstream, out string outFileName)
{
if (basedir != null)
{
// Sometimes the name on the entry starts with a slash.
// Rather than unpack to the root of the volume, we're going to
// drop the slash and unpack to the specified base directory.
string f = this.FileName.Replace("\\","/");
// workitem 11772: remove drive letter with separator
if (f.IndexOf(':') == 1)
f= f.Substring(2);
if (f.StartsWith("/"))
f= f.Substring(1);
// String.Contains is not available on .NET CF 2.0
if (_container.ZipFile.FlattenFoldersOnExtract)
outFileName = Path.Combine(basedir,
(f.IndexOf('/') != -1) ? Path.GetFileName(f) : f);
else
outFileName = Path.Combine(basedir, f);
// workitem 10639
outFileName = outFileName.Replace("/","\\");
// check if it is a directory
if ((IsDirectory) || (FileName.EndsWith("/")))
{
if (!Directory.Exists(outFileName))
{
Directory.CreateDirectory(outFileName);
_SetTimes(outFileName, false);
}
else
{
// the dir exists, maybe we want to overwrite times.
if (ExtractExistingFile == ExtractExistingFileAction.OverwriteSilently)
_SetTimes(outFileName, false);
}
return true; // true == all done, caller will return
}
return false; // false == work to do by caller.
}
if (outstream != null)
{
outFileName = null;
if ((IsDirectory) || (FileName.EndsWith("/")))
{
// extract a directory to streamwriter? nothing to do!
return true; // true == all done! caller can return
}
return false;
}
throw new ArgumentNullException("outstream");
}