/*== == Copyright : BlueCurve (c) == Licence : Gnu/GPL v2.x == Author : Teddy Albina == Email : bluecurveteam@gmail.com == Web site : http://www.codeplex.com/BlueCurve */ using System; using System.IO; using System.Text; using System.Transactions; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; using System.Runtime.Serialization.Formatters.Binary; namespace BlueCurve.Search.Common.IO { /// <summary> /// Fournit des méthodes de gestions du système de fichier /// </summary> public class CommonStream { #region Import native methods /// <summary> /// Méthode native vérifiant si un répertoire est vide /// </summary> /// <param name="pszPath">Chemin du répertoire à tester</param> /// <returns>bool</returns> [DllImport("shlwapi.dll", CharSet = CharSet.Auto)] private extern static bool PathIsDirectoryEmpty(string pszPath); #region 'Kernel transaction manager api management' /// <summary> /// Represente un handle de transaction /// </summary> public sealed class SafeTransactionHandle : SafeHandleZeroOrMinusOneIsInvalid { private SafeTransactionHandle() : base(true) { } public SafeTransactionHandle(IntPtr preexistingHandle, bool ownsHandle) : base(ownsHandle) { SetHandle(preexistingHandle); } public enum FileAccess { GENERIC_READ = unchecked((int)0x80000000), GENERIC_WRITE = 0x40000000 } [Flags] public enum FileShare { FILE_SHARE_NONE = 0x00, FILE_SHARE_READ = 0x01, FILE_SHARE_WRITE = 0x02, FILE_SHARE_DELETE = 0x04 } public enum FileMode { CREATE_NEW = 1, CREATE_ALWAYS = 2, OPEN_EXISTING = 3, OPEN_ALWAYS = 4, TRUNCATE_EXISTING = 5 } [DllImport("Kernel32.dll", SetLastError = true)] private static extern bool CloseHandle(IntPtr handle); override protected bool ReleaseHandle() { return CloseHandle(handle); } } /// <summary> /// Importation de la fonction native CreateFileTransacted() permettant /// de créer une transaction ntfs /// </summary> /// <returns>SafeFileHandle</returns> [DllImport("Kernel32.Dll", EntryPoint = "CreateFileTransacted", CharSet = CharSet.Unicode, SetLastError = true)] protected static extern SafeFileHandle CreateFileTransacted( [In] String lpFileName, [In] SafeTransactionHandle.FileAccess dwDesiredAccess, [In] SafeTransactionHandle.FileShare dwShareMode, [In] IntPtr lpSecurityAttributes, [In] SafeTransactionHandle.FileMode dwCreationDisposition, [In] int dwFlagsAndAttributes, [In] IntPtr hTemplateFile, [In] SafeTransactionHandle txHandle, [In] IntPtr miniVersion, [In] IntPtr extendedOpenInformation ); /// <summary> /// Importation de l'interface KTM /// </summary> [ComImport] [Guid("79427A2B-F895-40e0-BE79-B57DC82ED231")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] protected interface IKernelTransaction { void GetHandle(out SafeTransactionHandle ktmHandle); } #endregion #endregion /// <summary> /// Copie un stream dans un autre /// de façon asynchrone /// http://msdn.microsoft.com/fr-fr/magazine/cc337900.aspx /// </summary> /// <param name="source">Stream source</param> /// <param name="destination">Stream destination</param> /// <param name="completed">Action()</param> public static void CopyStreamToStream(FileStream source, FileStream destination, Action<FileStream, FileStream, Exception> completed) { byte[] buffer = new byte[0x1024]; System.ComponentModel.AsyncOperation asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(null); Action<Exception> done = e => { if (completed != null) asyncOp.Post(delegate { completed(source, destination, e); }, null); }; AsyncCallback rc = null; rc = readResult => { try { int read = source.EndRead(readResult); if (read > 0) { destination.BeginWrite(buffer, 0, read, writeResult => { try { destination.EndWrite(writeResult); source.BeginRead( buffer, 0, buffer.Length, rc, null); } catch (Exception exc) { done(exc); } }, null); } else done(null); } catch (Exception exc) { done(exc); } }; source.BeginRead(buffer, 0, buffer.Length, rc, null); } /// <summary> /// Vérifie qu'un répertoire est vide /// </summary> /// <param name="path">Chemin de fichier du répertoire</param> /// <returns>bool</returns> public static bool DirectoryIsEmpty(string path) { return PathIsDirectoryEmpty(path); } #region Transactional methods /// <summary> /// Ecrit un fichier de façon transactionnel /// </summary> /// <param name="data">Données à écrire</param> /// <param name="path">Chemin du fichier dans lequel écrire les données</param> /// <returns>Statut de l'opération</returns> public static bool WriteFileTransacted(object data, string path) { if (data == null) return false; SafeTransactionHandle txHandle = null; SafeFileHandle fileHandle = null; bool response = true; try { IKernelTransaction kernelTx = (IKernelTransaction)TransactionInterop.GetDtcTransaction(System.Transactions.Transaction.Current); kernelTx.GetHandle(out txHandle); fileHandle = CreateFileTransacted( path , SafeTransactionHandle.FileAccess.GENERIC_WRITE , SafeTransactionHandle.FileShare.FILE_SHARE_NONE , IntPtr.Zero , SafeTransactionHandle.FileMode.CREATE_ALWAYS , 0 , IntPtr.Zero , txHandle , IntPtr.Zero , IntPtr.Zero); if (fileHandle.IsInvalid) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); using (FileStream stream = new FileStream(fileHandle, FileAccess.Write, 1024, false)) { BinaryFormatter writer = new BinaryFormatter(); writer.Serialize(stream, data); stream.Close(); } } catch { System.Transactions.Transaction.Current.Rollback(); response = false; } finally { if (fileHandle != null && !fileHandle.IsInvalid) { fileHandle.Close(); fileHandle.Dispose(); } if (txHandle != null && !txHandle.IsInvalid) { txHandle.Close(); txHandle.Dispose(); } } return response; } /// <summary> /// Lit un fichier de façon transactionnel /// </summary> /// <param name="path">Chemin du fichier à lire</param> /// <returns>Données lu</returns> public object ReadFileTransacted(string path) { if (!File.Exists(path)) return null; SafeTransactionHandle txHandle = null; SafeFileHandle fileHandle = null; object raw = null; try { IKernelTransaction kernelTx = (IKernelTransaction)TransactionInterop.GetDtcTransaction(System.Transactions.Transaction.Current); kernelTx.GetHandle(out txHandle); fileHandle = CreateFileTransacted( path , SafeTransactionHandle.FileAccess.GENERIC_READ , SafeTransactionHandle.FileShare.FILE_SHARE_READ , IntPtr.Zero , SafeTransactionHandle.FileMode.OPEN_ALWAYS , 0 , IntPtr.Zero , txHandle , IntPtr.Zero , IntPtr.Zero); if (fileHandle.IsInvalid) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); using (FileStream stream = new FileStream(fileHandle, FileAccess.Read, 1024, false)) { BinaryFormatter reader = new BinaryFormatter(); raw = reader.Deserialize(stream); } } catch { raw = null; } finally { if (fileHandle != null && !fileHandle.IsInvalid) { fileHandle.Close(); fileHandle.Dispose(); } if (txHandle != null && !txHandle.IsInvalid) { txHandle.Close(); txHandle.Dispose(); } } return raw; } #endregion } }
File Stream
Gets a files' contents from an Url with NetworkCredential
/* Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #region Usings using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; #endregion namespace Utilities { public static class FileManager { /// <summary> /// Gets a files' contents /// </summary> /// <param name="FileName">File name</param> /// <param name="UserName">User name to log in</param> /// <param name="Password">Password to log in</param> /// <param name="OutputStream">The output stream of the file</param> /// <returns>a string containing the file's contents</returns> public static void GetFileContents(Uri FileName, string UserName, string Password, out Stream OutputStream) { WebClient Client = null; OutputStream = null; try { Client = new WebClient(); Client.Credentials = new NetworkCredential(UserName, Password); OutputStream = Client.OpenRead(FileName); } catch { } } } }
Gets a file's contents (Used primarily for text documents on an FTP)
/* Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #region Usings using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; #endregion namespace Utilities { public static class FileManager { /// <summary> /// Gets a file's contents (Used primarily for text documents on an FTP) /// </summary> /// <param name="FileName">Name of the file (should include the server address)</param> /// <param name="UserName">User name to log in</param> /// <param name="Password">Password to log in</param> /// <returns>A string containing the file's contents</returns> public static string GetFileContents(Uri FileName, string UserName, string Password) { WebClient Client = null; StreamReader Reader = null; try { Client = new WebClient(); Client.Credentials = new NetworkCredential(UserName, Password); Reader = new StreamReader(Client.OpenRead(FileName)); string Contents = Reader.ReadToEnd(); Reader.Close(); return Contents; } catch { return ""; } finally { if (Reader != null) { Reader.Close(); Reader.Dispose(); } if (Client != null) { Client.Dispose(); } } } } }
Gets a files' contents from a Url and save to an OutputStream
/* Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #region Usings using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; #endregion namespace Utilities { public static class FileManager { /// <summary> /// Gets a files' contents /// </summary> /// <param name="FileName">File name</param> /// <param name="OutputStream">The output stream of the file</param> /// <returns>a string containing the file's contents</returns> public static void GetFileContents(Uri FileName,out Stream OutputStream) { WebClient Client = null; OutputStream = null; try { Client = new WebClient(); OutputStream = Client.OpenRead(FileName); } catch { } } } }
Gets a files' contents from a Url
/* Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #region Usings using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; #endregion namespace Utilities { public static class FileManager { /// <summary> /// Gets a files' contents /// </summary> /// <param name="FileName">File name</param> /// <returns>a string containing the file's contents</returns> public static string GetFileContents(Uri FileName) { WebClient Client = null; StreamReader Reader = null; try { Client = new WebClient(); Reader = new StreamReader(Client.OpenRead(FileName)); string Contents = Reader.ReadToEnd(); Reader.Close(); return Contents; } catch { return ""; } finally { if (Reader != null) { Reader.Close(); Reader.Dispose(); } if (Client != null) { Client.Dispose(); } } } } }
Gets a files' contents with MemoryStream
/* Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #region Usings using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; #endregion namespace Utilities { public static class FileManager { /// <summary> /// Gets a files' contents /// </summary> /// <param name="FileName">File name</param> /// <param name="TimeOut">Amount of time in ms to wait for the file</param> /// <param name="Output">Output of the file in bytes</param> public static void GetFileContents(string FileName, out byte[]Output, int TimeOut) { FileStream Reader = null; MemoryStream TempReader=null; int StartTime = System.Environment.TickCount; try { bool Opened = false; while (!Opened) { try { if (System.Environment.TickCount - StartTime >= TimeOut) throw new System.IO.IOException("File opening timed out"); Reader = File.OpenRead(FileName); Opened = true; } catch (System.IO.IOException e) { throw e; } } byte[] Buffer = new byte[1024]; TempReader=new MemoryStream(); while(Reader.Read(Buffer,0,1024)==1024) { TempReader.Write(Buffer,0,Buffer.Length); } Reader.Close(); Output=TempReader.ToArray(); TempReader.Close(); } catch { Output = null; return; } finally { if (Reader != null) { Reader.Close(); Reader.Dispose(); } if (TempReader != null) { TempReader.Close(); TempReader.Dispose(); } } } } }
Gets a files' contents
/* Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #region Usings using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; #endregion namespace Utilities { /// <summary> /// Utility class for managing files /// </summary> public static class FileManager { /// <summary> /// Gets a files' contents /// </summary> /// <param name="FileName">File name</param> /// <returns>a string containing the file's contents</returns> public static string GetFileContents(string FileName) { try { return GetFileContents(FileName, 5000); } catch { throw; } } /// <summary> /// Gets a files' contents /// </summary> /// <param name="FileName">File name</param> /// <param name="TimeOut">Amount of time in ms to wait for the file</param> /// <returns>a string containing the file's contents</returns> public static string GetFileContents(string FileName, int TimeOut) { StreamReader Reader = null; int StartTime = System.Environment.TickCount; try { bool Opened = false; while (!Opened) { try { if (System.Environment.TickCount - StartTime >= TimeOut) throw new System.IO.IOException("File opening timed out"); Reader = File.OpenText(FileName); Opened = true; } catch (System.IO.IOException e) { throw e; } } string Contents = Reader.ReadToEnd(); Reader.Close(); return Contents; } catch { return ""; } finally { if (Reader != null) { Reader.Close(); Reader.Dispose(); } } } } }