I want to upload an entire folder keeping the same structure (folder, subfolders..) to a remote server. It´s necessary to ite开发者_运维百科rate all folder or is possible to get the folder and upload to the server ?
I can upload single files but I think that the strategy with the folders maybe (sure) is different.
Any suggestion?
Thanks
EDIT: Is a remote server
I'm not sure this is what you are looking for, but sometimes it might be easier to upload the zipped folder (with low compression level) and unpack it on the server, if you can manage this on a client side. If it is applicable for you you might use free .net zip library like the SharpZipLib, so you don't have to write the zipping routine by yourself.
Here is also the class for zipping/unzipping folders using thr SharZipLib:
using System;
using System.Collections;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
namespace ENSI.Releaser.Code
{
public class ZipUtility
{
public void ZipFiles(string inputFolderPath, string outputPathAndFile, string password)
{
ArrayList ar = GenerateFileList(inputFolderPath); // generate file list
int trimLength = (Directory.GetParent(inputFolderPath)).ToString().Length;
// find number of chars to remove // from orginal file path
trimLength += 1; //remove '\'
FileStream ostream;
byte[] obuffer;
string outPath = inputFolderPath + @"\" + outputPathAndFile;
var oZipStream = new ZipOutputStream(File.Create(outPath)); // create zip stream
if (!string.IsNullOrEmpty(password))
oZipStream.Password = password;
oZipStream.SetLevel(9); // maximum compression
ZipEntry oZipEntry;
foreach (string fil in ar) // for each file, generate a zipentry
{
oZipEntry = new ZipEntry(fil.Remove(0, trimLength));
oZipStream.PutNextEntry(oZipEntry);
if (!fil.EndsWith(@"/")) // if a file ends with '/' its a directory
{
ostream = File.OpenRead(fil);
obuffer = new byte[ostream.Length];
ostream.Read(obuffer, 0, obuffer.Length);
oZipStream.Write(obuffer, 0, obuffer.Length);
}
}
oZipStream.Finish();
oZipStream.Close();
}
private ArrayList GenerateFileList(string dir)
{
var fils = new ArrayList();
bool Empty = true;
foreach (string file in Directory.GetFiles(dir)) // add each file in directory
{
fils.Add(file);
Empty = false;
}
if (Empty)
{
if (Directory.GetDirectories(dir).Length == 0)
// if directory is completely empty, add it
{
fils.Add(dir + @"/");
}
}
foreach (string dirs in Directory.GetDirectories(dir)) // recursive
{
foreach (object obj in GenerateFileList(dirs))
{
fils.Add(obj);
}
}
return fils; // return file list
}
public void UnZipFiles(string zipPathAndFile, string outputFolder, string password, bool deleteZipFile)
{
var s = new ZipInputStream(File.OpenRead(zipPathAndFile));
if (!string.IsNullOrEmpty(password))
s.Password = password;
ZipEntry theEntry;
string tmpEntry = String.Empty;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = outputFolder;
string fileName = Path.GetFileName(theEntry.Name);
// create directory
if (directoryName != "")
{
Directory.CreateDirectory(directoryName);
}
if (fileName != String.Empty)
{
if (theEntry.Name.IndexOf(".ini") < 0)
{
string fullPath = directoryName + "\\" + theEntry.Name;
fullPath = fullPath.Replace("\\ ", "\\");
string fullDirPath = Path.GetDirectoryName(fullPath);
if (!Directory.Exists(fullDirPath)) Directory.CreateDirectory(fullDirPath);
FileStream streamWriter = File.Create(fullPath);
int size = 2048;
byte[] data = new byte[size];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
}
s.Close();
if (deleteZipFile)
File.Delete(zipPathAndFile);
}
}
}
If I rigth understood your question you can:
A) recreate folder structure on the server and move the files there
B) zip your root folder, move it to server and unzip.
精彩评论