Ejemplo n.º 1
0
        public int CreateFile(string filename, FileAccess access, FileShare share,
                              FileMode mode, FileOptions options, DokanFileInfo info)
        {
            int ret = 0;

            if (filename.EndsWith(":SSHFSProperty.Cache"))
            {
                System.Diagnostics.Debug.WriteLine("SSHFS.Cache: " + filename);

                filename = filename.Remove(filename.IndexOf(":SSHFSProperty.Cache"));
                CacheEntry entry = cache_.Lookup(filename);
                entry.RemoveAllCache();
                return(0);
            }

            if (mode == FileMode.Open || mode == FileMode.OpenOrCreate)
            {
                CacheEntry entry = cache_.Lookup(filename);

                if (mode == FileMode.OpenOrCreate)
                {
                    if (entry.Parrent != null)
                    {
                        entry.Parrent.RemoveFindFilesCache();
                    }
                }

                if (entry.CreateFileRet == int.MaxValue)
                {
                    ret = ope_.CreateFile(filename, access, share, mode, options, info);
                    entry.CreateFileRet = ret;
                }
                else
                {
                    ret = entry.CreateFileRet;
                }
            }
            else
            {
                ret = ope_.CreateFile(filename, access, share, mode, options, info);

                if (mode == FileMode.Create || mode == FileMode.CreateNew)
                {
                    CacheEntry entry = cache_.Lookup(filename);
                    if (entry.Parrent != null)
                    {
                        entry.Parrent.RemoveFindFilesCache();
                    }
                }
            }
            return(ret);
        }
Ejemplo n.º 2
0
        public int CreateFile(string filename, FileAccess access, FileShare share,
                              FileMode mode, FileOptions options, DokanFileInfo info)
        {
            int ret = 0;

            if (mode == FileMode.Open || mode == FileMode.OpenOrCreate)
            {
                CacheEntry entry = cache_.Lookup(filename);

                if (mode == FileMode.OpenOrCreate)
                {
                    if (entry.Parent != null)
                    {
                        entry.Parent.RemoveFindFilesCache();
                    }
                }

                if (entry.CreateFileRet == int.MaxValue)
                {
                    ret = ope_.CreateFile(filename, access, share, mode, options, info);
                    entry.CreateFileRet = ret;
                }
                else
                {
                    ret = entry.CreateFileRet;
                }
            }
            else
            {
                ret = ope_.CreateFile(filename, access, share, mode, options, info);

                if (mode == FileMode.Create || mode == FileMode.CreateNew)
                {
                    CacheEntry entry = cache_.Lookup(filename);
                    if (entry.Parent != null)
                    {
                        entry.Parent.RemoveFindFilesCache();
                    }
                }
            }
            return(ret);
        }
Ejemplo n.º 3
0
        public int CreateFileProxy(
            IntPtr rawFileName,
            uint rawAccessMode,
            uint rawShare,
            uint rawCreationDisposition,
            uint rawFlagsAndAttributes,
            ref DOKAN_FILE_INFO rawFileInfo)
        {
            try
            {
                string file = GetFileName(rawFileName);

                DokanFileInfo info = GetNewFileInfo(ref rawFileInfo);

                FileAccess  access  = FileAccess.Read;
                FileShare   share   = FileShare.None;
                FileMode    mode    = FileMode.Open;
                FileOptions options = FileOptions.None;

                if ((rawAccessMode & FILE_READ_DATA) != 0 && (rawAccessMode & FILE_WRITE_DATA) != 0)
                {
                    access = FileAccess.ReadWrite;
                }
                else if ((rawAccessMode & FILE_WRITE_DATA) != 0)
                {
                    access = FileAccess.Write;
                }
                else
                {
                    access = FileAccess.Read;
                }

                if ((rawShare & FILE_SHARE_READ) != 0)
                {
                    share = FileShare.Read;
                }

                if ((rawShare & FILE_SHARE_WRITE) != 0)
                {
                    share |= FileShare.Write;
                }

                if ((rawShare & FILE_SHARE_DELETE) != 0)
                {
                    share |= FileShare.Delete;
                }

                switch (rawCreationDisposition)
                {
                case CREATE_NEW:
                    mode = FileMode.CreateNew;
                    break;

                case CREATE_ALWAYS:
                    mode = FileMode.Create;
                    break;

                case OPEN_EXISTING:
                    mode = FileMode.Open;
                    break;

                case OPEN_ALWAYS:
                    mode = FileMode.OpenOrCreate;
                    break;

                case TRUNCATE_EXISTING:
                    mode = FileMode.Truncate;
                    break;
                }

                int ret = operations_.CreateFile(file, access, share, mode, options, info);

                if (info.IsDirectory)
                {
                    rawFileInfo.IsDirectory = 1;
                }

                return(ret);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.ToString());
                return(-2);
            }
        }
Ejemplo n.º 4
0
Archivo: Proxy.cs Proyecto: suy/dokany
        public int CreateFileProxy(
            IntPtr rawFileName,
            uint rawAccessMode,
            uint rawShare,
            uint rawCreationDisposition,
            uint rawFlagsAndAttributes,
            ref DOKAN_FILE_INFO rawFileInfo)
        {
            try
            {
                string file = GetFileName(rawFileName);

                DokanFileInfo info = GetNewFileInfo(ref rawFileInfo);

                FileAccess  access  = FileAccess.Read;
                FileShare   share   = FileShare.None;
                FileMode    mode    = FileMode.Open;
                FileOptions options = FileOptions.None;

                if ((rawAccessMode & FILE_READ_DATA) != 0 && (rawAccessMode & FILE_WRITE_DATA) != 0)
                {
                    access = FileAccess.ReadWrite;
                }
                else if ((rawAccessMode & FILE_WRITE_DATA) != 0)
                {
                    access = FileAccess.Write;
                }
                else
                {
                    access = FileAccess.Read;
                }

                if ((rawShare & FILE_SHARE_READ) != 0)
                {
                    share = FileShare.Read;
                }

                if ((rawShare & FILE_SHARE_WRITE) != 0)
                {
                    share |= FileShare.Write;
                }

                if ((rawShare & FILE_SHARE_DELETE) != 0)
                {
                    share |= FileShare.Delete;
                }

                if ((rawFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE) != 0)
                {
                    options |= FileOptions.DeleteOnClose;
                }

                if ((rawFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH) != 0)
                {
                    options |= FileOptions.WriteThrough;
                }

                if ((rawFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN) != 0)
                {
                    options |= FileOptions.SequentialScan;
                }

                if ((rawFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS) != 0)
                {
                    options |= FileOptions.RandomAccess;
                }

                if ((rawFlagsAndAttributes & FILE_FLAG_OVERLAPPED) != 0)
                {
                    options |= FileOptions.Asynchronous;
                }
                // TODO: supports FileOptions.Encrypted

                switch (rawCreationDisposition)
                {
                case CREATE_NEW:
                    mode = FileMode.CreateNew;
                    break;

                case CREATE_ALWAYS:
                    mode = FileMode.Create;
                    break;

                case OPEN_EXISTING:
                    mode = FileMode.Open;
                    break;

                case OPEN_ALWAYS:
                    mode = FileMode.OpenOrCreate;
                    break;

                case TRUNCATE_EXISTING:
                    mode = FileMode.Truncate;
                    break;
                }

                int ret = operations_.CreateFile(file, access, share, mode, options, info);

                if (info.IsDirectory)
                {
                    rawFileInfo.IsDirectory = 1;
                }

                return(ret);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.ToString());
                return(-2);
            }
        }