public void MoveFile(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            using (Stream s = fi.Create())
            {
                for (int i = 0; i < 10; ++i)
                {
                    s.Write(new byte[111], 0, 111);
                }
            }
            fi.Attributes = FileAttributes.Hidden | FileAttributes.System;

            fi.MoveTo("foo2.txt");

            fi = fs.GetFileInfo("foo2.txt");
            Assert.IsTrue(fi.Exists);
            Assert.AreEqual(1110, fi.Length);
            Assert.AreEqual(FileAttributes.Hidden | FileAttributes.System, fi.Attributes);

            fi = fs.GetFileInfo("foo.txt");
            Assert.IsFalse(fi.Exists);
        }
        public void Open_FileNotFound(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo di = fs.GetFileInfo("foo.txt");

            using (Stream s = di.Open(FileMode.Open)) { }
        }
        public void Attributes_ChangeType(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            using (Stream s = fi.Open(FileMode.Create)) { }

            fi.Attributes = fi.Attributes | FileAttributes.Directory;
        }
        public void Open_DirExists(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            fs.CreateDirectory("FOO.TXT");

            DiscFileInfo di = fs.GetFileInfo("foo.txt");

            using (Stream s = di.Open(FileMode.Create)) { s.WriteByte(1); }
        }
        public void Open_FileExists(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo di = fs.GetFileInfo("foo.txt");

            using (Stream s = di.Open(FileMode.Create)) { s.WriteByte(1); }

            using (Stream s = di.Open(FileMode.CreateNew)) { }
        }
        public void Open_Read_Fail(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo di = fs.GetFileInfo("foo.txt");

            using (Stream s = di.Open(FileMode.Create, FileAccess.Read))
            {
                s.WriteByte(1);
            }
        }
        public void Parent(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            fs.CreateDirectory(@"SOMEDIR\ADIR");
            using (Stream s = fs.OpenFile(@"SOMEDIR\ADIR\FILE.TXT", FileMode.Create)) { }

            DiscFileInfo fi = fs.GetFileInfo(@"SOMEDIR\ADIR\FILE.TXT");

            Assert.AreEqual(fs.GetDirectoryInfo(@"SOMEDIR\ADIR"), fi.Parent);
            Assert.AreEqual(fs.GetDirectoryInfo(@"SOMEDIR\ADIR"), fi.Directory);
        }
        public void Open_Write(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo di = fs.GetFileInfo("foo.txt");

            using (Stream s = di.Open(FileMode.Create, FileAccess.Write))
            {
                Assert.IsTrue(s.CanWrite);
                Assert.IsFalse(s.CanRead);
                s.WriteByte(1);
            }
        }
        public void DeleteFile(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            using (Stream s = fs.GetFileInfo("foo.txt").Open(FileMode.Create, FileAccess.ReadWrite)) { }

            Assert.AreEqual(1, fs.Root.GetFiles().Length);

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            fi.Delete();

            Assert.AreEqual(0, fs.Root.GetFiles().Length);
        }
        public void Exists(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            Assert.IsFalse(fi.Exists);

            using (Stream s = fi.Open(FileMode.Create)) { }
            Assert.IsTrue(fi.Exists);

            fs.CreateDirectory("dir.txt");
            Assert.IsFalse(fs.GetFileInfo("dir.txt").Exists);
        }
        public void LastWriteTime(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            using (Stream s = fs.OpenFile("foo.txt", FileMode.Create)) { }
            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            DateTime baseTime = DateTime.Now - TimeSpan.FromMinutes(10);

            fi.LastWriteTime = baseTime;

            using (Stream s = fs.OpenFile("foo.txt", FileMode.Open)) { s.WriteByte(1); }

            Assert.Less(baseTime, fi.LastWriteTime);
        }
        public void LastAccessTime(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            using (Stream s = fs.OpenFile("foo.txt", FileMode.Create)) { }
            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            DateTime baseTime = DateTime.Now - TimeSpan.FromDays(2);

            fi.LastAccessTime = baseTime;

            using (Stream s = fs.OpenFile("foo.txt", FileMode.Open, FileAccess.Read)) { }

            Assert.Less(baseTime, fi.LastAccessTime);
        }
        public void Attributes(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            using (Stream s = fi.Open(FileMode.Create)) { }

            // Check default attributes
            Assert.AreEqual(FileAttributes.Archive, fi.Attributes);

            // Check round-trip
            FileAttributes newAttrs = FileAttributes.Hidden | FileAttributes.ReadOnly | FileAttributes.System;

            fi.Attributes = newAttrs;
            Assert.AreEqual(newAttrs, fi.Attributes);

            // And check persistence to disk
            Assert.AreEqual(newAttrs, fs.GetFileInfo("foo.txt").Attributes);
        }
        public void CreateFile(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            using (Stream s = fs.GetFileInfo("foo.txt").Open(FileMode.Create, FileAccess.ReadWrite))
            {
                s.WriteByte(1);
            }

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            Assert.IsTrue(fi.Exists);
            Assert.AreEqual(FileAttributes.Archive, fi.Attributes);
            Assert.AreEqual(1, fi.Length);

            using (Stream s = fs.OpenFile("Foo.txt", FileMode.Open, FileAccess.Read))
            {
                Assert.AreEqual(1, s.ReadByte());
            }
        }
        public void MoveFile_Overwrite(NewFileSystemDelegate fsFactory)
        {
            DiscFileSystem fs = fsFactory();

            DiscFileInfo fi = fs.GetFileInfo("foo.txt");

            using (Stream s = fi.Create())
            {
                s.WriteByte(1);
            }

            DiscFileInfo fi2 = fs.GetFileInfo("foo2.txt");

            using (Stream s = fi2.Create())
            {
            }

            fs.MoveFile("foo.txt", "foo2.txt", true);

            Assert.IsFalse(fi.Exists);
            Assert.IsTrue(fi2.Exists);
            Assert.AreEqual(1, fi2.Length);
        }
Exemple #16
0
 public void Add(DiscFileInfo Source, DiscFileInfo Destination, DiscFileInfo Base = null)
 {
     _queue[Destination] = new Lineage(Source, Base);
 }
Exemple #17
0
        private static bool FilesMatch(DiscFileInfo A, DiscFileInfo B)
        {
            const int BufferSize = 2048;  // arbitrarily chosen buffer size
            byte[] buffA = new byte[BufferSize];
            byte[] buffB = new byte[BufferSize];

            lock(A.FileSystem)
                lock (B.FileSystem)
                {
                    var fileA = A.OpenRead();
                    var fileB = B.OpenRead();

                    int numA, numB;
                    while (fileA.Position < fileA.Length)
                    {
                        numA = fileA.Read(buffA, 0, BufferSize);
                        numB = fileB.Read(buffB, 0, BufferSize);
                        if (numA != numB)
                        {
                            fileA.Close();
                            fileB.Close();
                            return false;
                        }
                        for (int i = 0; i < numA; i++)
                            if (buffA[i] != buffB[i])
                            {
                                fileA.Close();
                                fileB.Close();
                                return false;
                            }
                    }
                    fileA.Close();
                    fileB.Close();
                    return true;
                }
        }
Exemple #18
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="A"></param>
        /// <param name="B"></param>
        /// <param name="Style"></param>
        /// <returns>True if A and B are equivalent.</returns>
        private static bool CompareFile(DiscFileInfo A, DiscFileInfo B, ComparisonStyle Style = ComparisonStyle.DateTimeOnly)
        {
            if (A == null || B == null) return A == B;
            lock (A.FileSystem)
                lock (B.FileSystem)
                    if (!A.Exists || !B.Exists) return false;

            if (Style == ComparisonStyle.Journaled)
                if (A.FileSystem is NtfsFileSystem)
                {
                    lock(A.FileSystem)
                        lock (B.FileSystem)
                        {
                            var An = A.FileSystem as NtfsFileSystem;
                            var Bn = (NtfsFileSystem) (B.FileSystem);
                            long Aid = (long) (An.GetFileId(A.FullName) & 0x0000ffffffffffff);
                            long Bid = (long) (Bn.GetFileId(B.FullName) & 0x0000ffffffffffff);

                            return An.GetMasterFileTable()[Aid].LogFileSequenceNumber ==
                                   Bn.GetMasterFileTable()[Bid].LogFileSequenceNumber;
                        }
                }
                else throw new ArgumentException("Journal comparison only functions on NTFS partitions.", "Style");

            bool LenCheck, WriteCheck;
            lock (A.FileSystem)
                lock (B.FileSystem)
                {
                    LenCheck = A.Length == B.Length;
                    WriteCheck = A.LastWriteTimeUtc == B.LastWriteTimeUtc;
                }

            return LenCheck &&
                   (Style == ComparisonStyle.NameOnly || (Style == ComparisonStyle.BinaryOnly
                                                              ? FilesMatch(A, B)
                                                              : (WriteCheck &&
                                                                 (Style == ComparisonStyle.DateTimeOnly ||
                                                                  FilesMatch(A, B)))));
        }
Exemple #19
0
 public Lineage(DiscFileInfo source = null, DiscFileInfo @base = null)
 {
     Base = @base;
     Source = source;
 }
Exemple #20
0
        private void FileCopy(iSCSI iscsi, DiscFileInfo[] FileInfos, WimFileSystem w, NtfsFileSystem ntfs)
        {
            foreach (DiscFileInfo file in FileInfos)
            {
                if (IsExcluded(file.FullName))
                {
                    log.InfoFormat("File Skip {0}", file.FullName);
                    continue;
                }
                FileAttributes attr = file.Attributes;
                if ((attr & FileAttributes.ReparsePoint) == 0)
                {
                    using (Stream source = w.OpenFile(file.FullName, FileMode.Open, FileAccess.Read))
                    {
                        using (Stream destin = ntfs.OpenFile(file.FullName, FileMode.Create, FileAccess.Write))
                        {
                            iscsi.WimCopy(source, destin, Path.GetFileName(file.FullName), false, wimFileIndex++, wimFileCount);
                        }
                    }

                    if ((attr & FileAttributes.Temporary) == FileAttributes.Temporary)
                        attr = attr & ~FileAttributes.Temporary;
                    if ((attr & FileAttributes.Offline) == FileAttributes.Offline)
                        attr = attr & ~FileAttributes.Offline;
                    ntfs.SetAttributes(file.FullName, attr);
                }
                else
                {
                    traceLog.InfoFormat("Reparse Point: {0}", file.FullName);
                    ReparsePoint rp = w.GetReparsePoint(file.FullName);
                    ntfs.SetReparsePoint(file.FullName, rp);
                }
            }
        }
Exemple #21
0
 internal void Add(DiscFileInfo Source, DiscFileInfo Destination)
 {
     _queue[Destination] = Source;
 }