Esempio n. 1
0
        /// <summary>
        /// Create safe file stream
        /// </summary>
        /// <param name="drive">Driver name</param>
        /// <param name="type">Fila access type</param>
        /// <returns></returns>
        public static unsafe SafeStreamManager CreateStream(string drive, FileAccess type)
        {
            SafeStreamManager retVal = new SafeStreamManager();

            Microsoft.Win32.SafeHandles.SafeFileHandle h;

            int n_attempts = 1;

            while (n_attempts < MAX_ATTEMPTS_NUMBER)
            {
                h = CreateFile(drive, type, FileShare.None, 0, FileMode.Open, 0, 0);
                if (!h.IsInvalid)
                {
                    Stream inPutFile = new FileStream(h, type);
                    retVal.SH      = h;
                    retVal.STR     = inPutFile;
                    retVal.f_error = false;
                    return(retVal);
                }
                else
                {
                    n_attempts++;
                }
            }

            // Number of attempts over the MAX, CreateFileError
            retVal.f_error = true;
            return(retVal);
        }
Esempio n. 2
0
 /// <summary>
 /// Read bytes from DISK
 /// </summary>
 /// <param name="startingbyte">Byte offset from begin</param>
 /// <param name="numberOfBytes"></param>
 /// <param name="safeStreamManager"></param>
 /// <returns>Read data array</returns>
 /// <remarks>
 /// You can read a maximum of 2GB block (2.147.483.648 bytes)
 /// </remarks>
 public static unsafe byte[] ReadBytes(long startingbyte, int numberOfBytes, SafeStreamManager safeStreamManager)
 {
     byte[] data = new byte[numberOfBytes];
     if (!safeStreamManager.SH.IsInvalid)
     {
         if (safeStreamManager.STR.CanRead)
         {
             safeStreamManager.STR.Seek(startingbyte, SeekOrigin.Begin);
             safeStreamManager.STR.Read(data, 0, numberOfBytes);
             return(data);
         }
     }
     return(null);
 }
Esempio n. 3
0
        /// <summary>
        /// Drop the stream
        /// </summary>
        /// <param name="safeStreamManager"></param>
        /// <returns>true=OK false=error</returns>
        public static unsafe bool DropStream(SafeStreamManager safeStreamManager)
        {
            try
            {
                safeStreamManager.STR.Close();
                safeStreamManager.SH.Close();
                return(true);
            }
            catch (Exception)
            {
                return(false);

                throw;
            }
        }
Esempio n. 4
0
 /// <summary>
 /// Write blocks to DISK
 /// </summary>
 /// <param name="startingBlock"></param>
 /// <param name="numberOfBlocks"></param>
 /// <param name="blockSize"></param>
 /// <param name="data"></param>
 /// <param name="safeStreamManager"></param>
 /// <returns>0 ok -1 error</returns>
 /// <remarks>
 /// You can write a maximum of 2GB block (4.194.304 blocks)
 /// </remarks>
 public static unsafe int WriteBlocks(long startingBlock, int numberOfBlocks, int blockSize, byte[] data, SafeStreamManager safeStreamManager)
 {
     if (!safeStreamManager.SH.IsInvalid)
     {
         if (safeStreamManager.STR.CanRead)
         {
             safeStreamManager.STR.Seek(startingBlock * blockSize, SeekOrigin.Begin);
             safeStreamManager.STR.Write(data, 0, numberOfBlocks * blockSize);
             safeStreamManager.STR.Flush();
             return(0);
         }
     }
     return(-1);
 }
Esempio n. 5
0
 /// <summary>
 /// Read block from DISK
 /// </summary>
 /// <param name="startingBlock"></param>
 /// <param name="numberOfBlocks"></param>
 /// <param name="blockSize"></param>
 /// <param name="safeStreamManager"></param>
 /// <returns>Read data array</returns>
 /// <remarks>
 /// You can read a maximum of 2GB block (4.194.304 blocks)
 /// </remarks>
 public static unsafe byte[] ReadBlocks(long startingBlock, int numberOfBlocks, int blockSize, SafeStreamManager safeStreamManager)
 {
     byte[] data = new byte[numberOfBlocks * blockSize];
     if (!safeStreamManager.SH.IsInvalid)
     {
         if (safeStreamManager.STR.CanRead)
         {
             safeStreamManager.STR.Seek(startingBlock * blockSize, SeekOrigin.Begin);
             safeStreamManager.STR.Read(data, 0, numberOfBlocks * blockSize);
             return(data);
         }
     }
     return(null);
 }