|
I see, ok. Thank you for your time
|
|
|
|
|
Requirement: 1) creating split zips file in multiple segments(say size - 1 GB/500 MB), so that they can be downloaded through browser. The total zip volume of all the segments could exceed 10 GB 2) the zip content could be multiple files or a folder containing sub folders and files 3) the content of the file are read from Cloud in the form of stream. The meta information for the files(like folder hierarchy) are locally available
I am using DotNetZip library to achieve the task. The code is as following:
long length = default(long);
Stream fileReadStream;
long Space = default(long);
string tempZipFile = string.Empty;
FileZipStatus oldStatue = new FileZipStatus();
byte[] Buffer = new byte[1024 * 1024];
if (zipFileName != null && !zipFileName.ToUpper().EndsWith(".ZIP")) zipFileName += ".zip";
string strTempFolder = "";
using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
{
try
{
strTempFolderPath = tempZipOutPutFilePath + "\\";
string strTempFolderName = DateTime.Now.Ticks.ToString();
strTempFolder = strTempFolderPath + strTempFolderName;
if (userFileList.Count > 0)
{
if (Directory.Exists(strTempFolder))
{
Directory.Delete(strTempFolder);
}
Directory.CreateDirectory(strTempFolder);
}
foreach (UserFile userFile in userFileList)
{
WebResponse response = null;
try
{
WebRequest request = null;
IDictionary<string, object> _dictionary = new Dictionary<string, object>();
FileSystemEnum fileSysEnum = FileSystemBase.GetFileSystemEnumByStorageId(userFile.StorageId);
IFileSystemLib ifileSystemLocal = FileSystemFactory.GetSpecificInstance(fileSysEnum);
fileReadStream = ifileSystemLocal.GetFile(userFile.FilePath, userFile.GuidName, ref request, ref response, _dictionary);
long filesize = default(long);
long.TryParse(ifileSystemLocal.GetFileContentLength(userFile.FilePath, userFile.GuidName).ToString(), out filesize);
Space = (Space > default(long)) ? (Space + filesize) : filesize;
int dataToRead;
FileStream writeStream = new FileStream(strTempFolder + "\\" + userFile.FileName, FileMode.Create, FileAccess.Write);
while ((dataToRead = fileReadStream.Read(Buffer, 0, Buffer.Length)) > 0)
{
writeStream.Write(Buffer, 0, dataToRead);
}
writeStream.Close();
zip.AddFile(strTempFolder + "\\" + userFile.FileName, userFile.RelativePath);
fileReadStream.Close();
}
catch (Exception ex)
{
LogManager.Trace(ex, "ZIpping Block - ZIPFileName", zipFileName + "File to zip" + userFile.GuidName);
}
finally
{
if (response != null) response.Close();
}
}
}
catch (Exception ex)
{
_currentStatus = FileZipStatus.NotAvailable;
oldStatue = UpdateZipStatus(ObjectZipID, Space, FileZipStatus.Failed);
throw ex;
}
finally
{
}
try
{
zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");
zip.MaxOutputSegmentSize = 200 * 1024 * 1024;
zip.Save(strTempFolderPath + "\\" + zipFileName);
oldStatue = UpdateZipStatus(ObjectZipID, Space, FileZipStatus.Available);
length = new FileInfo(strTempFolderPath + "\\" + zipFileName).Length;
_currentStatus = FileZipStatus.Available;
Directory.Delete(strTempFolder, true);
}
catch (Exception ex)
{
_currentStatus = FileZipStatus.NotAvailable;
oldStatue = UpdateZipStatus(ObjectZipID, Space, FileZipStatus.Failed);
length = default(long);
throw ex;
}
}
There are a limitation of the DotNetZip libray used in the above code. It either needs a) files saved on disk as input. In that case folder hierarchy information could be passed for each file. or 2) if stream is passed as input, folder hierarchy information could NOT be passed for file.
I need to pass in the folder hierarchy information for each file as well as read the input from stream. As the zip content could be huge(could exceed 10 GB), do not want to save the files on temporary storage in web server. Can Anyone help like how to pass folder hierarchy when creating zip file? thanks
tbhattacharjee
|
|
|
|
|
It would be rather unlogical to do this in memory; chances are that the server has more disk space available then it has memory. If it runs out of memory, the server will still use a file - as everything is pushed to the swap-file.
Do it on the filesystem.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I did something a bit like this in a WebDav server and i can see the advantage of zipping up files to increase the speed but you won't gain much on large Avi files because they have already been compressed.
One size will not fit all here and i think you would be best off zipping up the folders to include hundreds of little files but then sending the big files say over 200mb one file at a time.
Streaming 2gb movie files can be a bit hit and go in a single stream and then buffering it up in memory to unzip so maybe look at something that can return chunks of big files with a starting offset like FTP now uses
Good luck, not an easy one
|
|
|
|
|
It would be a rather bad idea to do this in memory.
Think about it. How many clients can possibly be going through this process and each coming up with your theoretical 10GBs of source content? Even if it was just 5 clients, you could have 50GB worth of content in memory.
There's nothing like putting a virtual mountain of memory pressure on the web server now, isn't there? How much memory does your web server really have? Uh huh, I thought so.
|
|
|
|
|
yes you are right to create zip file in memory. so i change my plan and issue has been solved.
tbhattacharjee
|
|
|
|
|
Tridip Bhattacharjee wrote: There are a limitation of the DotNetZip libray used in the above code. It either needs a) files saved on disk as input. In that case folder hierarchy information could be passed for each file. or 2) if stream is passed as input, folder hierarchy information could NOT be passed for file.
What's wrong with calling:
zip.AddEntry(@"Path\In\Zip\File.bin", theFileStream);
The documentation for the entryName parameter says:
The name, including any path, which is shown in the zip file for the added entry.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
hello
i have a one string like name="به نام خدا " and want split this to array string[] splitName and splitName={"ا","خد","م","نا","به"}
I would do this with code
How do I this ?
|
|
|
|
|
The way you have it written, it's impossible because the characters in splitName appear in a different order from the original string.
If, however you don't care about the order of the characters, you could do:
string Name = "به نام خدا ";
string[] splitName = Name.Split(new char[]{' '});
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Thank you
I want to write a program that can move text characters with mouse
Chspydh characters to move together
How do you think I am
|
|
|
|
|
Maybe a Regular Expression?
|
|
|
|
|
|
"Regular Expression"
Now thats one thing i can never get my head around and yet my two most used functions of all time used in a string extention method could be done using a one line RegEx
public static string ChopOffBefore(this string s, string Before)
{
int End = s.ToUpper().IndexOf(Before.ToUpper());
if (End > -1)
{
return s.Substring(End + Before.Length);
}
return s;
}
public static string ChopOffAfter(this string s, string After)
{
int End = s.ToUpper().IndexOf(After.ToUpper());
if (End > -1)
{
return s.Substring(0, End);
}
return s;
}
I just could not live without them, must be old school
modified 6-Apr-15 10:54am.
|
|
|
|
|
Rather than converting both strings to upper-case, which creates a new string, you simply need to pass a StringComparison to the IndexOf method:
int End = s.IndexOf(Before, StringComparison.OrdinalIgnoreCase);
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
You sir are 100% right
I just about always use "StringComparison.OrdinalIgnoreCase" when using a string key in a dictionary but forget to use it on things like IndexOf and i never use string.empty bcus "" is faster to type.
Not only that but it is very rare for me to lock string when using threads and i tend to just swap strings in and out to avoid race conditions but it has never caught me out so long as the strings are not too big.
When i am not a macro writer (thats all we are becoming with .Net) i am a string butcher
|
|
|
|
|
Hi,
I would like to develop a tool which would be help to install windows OS on selected IP's Machines , These IP's are in same LAN. How can i do coding in C#.
Thanks in Advance.
|
|
|
|
|
Just how do you propose to do that?
Unless the PC's have an OS installed, they won't have an IP address, so you won't be able to contact them...and if they have an OS installed, it's going to be up to the OS exactly what you have to do, won't it?
And just how do you propose to handle licencing and the various product keys you are going to need?
I know you can do it - see Remote Installation Services[^] - But I don't think you can "kick the process off" from a centralised computer - you have to arrange for the individual PCs to boot from the network.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
In case my systems already have OS : My tool has to give me list of IPs connected in the network and then i select few of the IPs(single IP) and it has to install selected software's(OS's,msoffice,Adobe reader, VLC player.. etc) On those meashines .
|
|
|
|
|
|
Systems like this already exist. Alteris by Symantec and System Center Configuration Management from Microsoft, among others.
The problem you're describing is far more complex than you realize. You need a client running on each machine, reporting back to a central server what it's IP currently is along with some identifier that uniquely ID's that machine.
Why? Laptops. Laptops can change IP addresses just by popping the machine out of the docking station. The DNS infrastructure will not update the change in IP address instantly, so when your server tries to contact the machine using DNS information, it won't get a response.
More problems consist of how you're going to sync up content between the server and the clients? How is the client going to know what it has to install and what it already installed? How is the content going to be transferred from the server to the clients for installation? How is the client going to verify that it has all the content for an installation?
What happens if the client or the server drops off the network in the middle of a content transfer? How are you going to recover from this situation?
No, you cannot run all installers from a server location. Some installers just don't tolerate that while others cannot be installed by multiple machines at the same time. It will work for most installers, but there's always one that will bite you in the ass. Trust me, I've been there.
If you think commercial software packages are too expensive to justify this, think about how much you get paid by the hour and how long it's going to take you to write both the server and client ends of this system and completely test it. I guarantee you it'll be more expensive than using an off-the-shelf solution.
|
|
|
|
|
Think about this. Why is it you don't already see a tool out there doing this?
Because what you want to do isn't possible without having some tool already running on the target machine.
On top of that, it's a MASSIVE security risk.
What you want to do isn't possible.
|
|
|
|
|
Dave Kreskowiak wrote: What you want to do isn't possible.
In theory, it is - you can use a Group Policy Startup Script[^] and push it to all PC's in the group.
I've not tried it, but it should work in a well controlled corporate environment. Nasty though!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
If the machine is already in AD and has an O/S on it, yeah it works. All actions run under the Local System account.
I'm approaching from the standpoint of a bare metal machine. No O/S, no anything on it.
|
|
|
|
|
So was I, but he replied with "In case my systems already have OS : My tool has to give me list ..." which changed it all a bit.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Problem Background:
In my WPF application, in one of the window/page contains 3 List Boxes and 1 ComboBox. These 3 ListBoxes are binded with XML dataprovider and there is no issues. I mean when 1st listbox selection changes automatically updates listbox2. In the same way, listbox3 updates as listbox2 changes. These are all worked out in XAMl file alone and there is code-behind except InitializeComponent() and few lines of code for loading this XAML file dynamically using XAMLReader(this is my requirement)
Problem facing Requirement:
OnSelection change event of any of the ListBox, need to populate ComboBox data dynamically( it will fire webservices which is based on above mentioned 3 LisBox selection). For this purpose, in SelectionChange I am trying to get
ListBoxObj.SelectedItem - Always contains XML tree.(i.e) of type XMLElement
I have tried all possiblities, everywhere I am getting only XML tree.
Anyone have any idea, how to extract ListBox selected Item Text from XMLElement?
Thanks
|
|
|
|