コード例 #1
0
ファイル: ICBFSFuncs.cs プロジェクト: jokalee/Amalgam
 private void EnumerateDirectory(CallbackFileSystem Sender, CbFsFileInfo directoryInfo, CbFsHandleInfo HandleInfo,
                                 CbFsDirectoryEnumerationInfo DirectoryEnumerationInfo, string Mask, int Index,
                                 [MarshalAs(UnmanagedType.U1)] bool Restart, ref bool FileFound, ref string FileName, ref string ShortFileName,
                                 ref DateTime CreationTime, ref DateTime LastAccessTime, ref DateTime LastWriteTime, ref long lengthOfFile,
                                 ref long AllocationSize, ref CBFS_LARGE_INTEGER FileId, ref uint FileAttributes)
 {
     Log.Trace("EnumerateDirectory IN");
     try
     {
         EnumerateDirectory(directoryInfo, HandleInfo, DirectoryEnumerationInfo, Mask, Restart,
                            ref FileFound, ref FileName, ref ShortFileName,
                            ref CreationTime, ref LastAccessTime, ref LastWriteTime,
                            ref lengthOfFile, ref AllocationSize, ref FileId, ref FileAttributes);
     }
     catch (Exception ex)
     {
         CBFSWinUtil.BestAttemptToECBFSError(ex);
     }
     finally
     {
         Log.Trace("EnumerateDirectory OUT");
     }
 }
コード例 #2
0
ファイル: ICBFSFuncs.cs プロジェクト: jokalee/Amalgam
 public abstract void CloseDirectoryEnumeration(CbFsFileInfo directoryInfo, CbFsDirectoryEnumerationInfo directoryEnumerationInfo);
コード例 #3
0
ファイル: ICBFSFuncs.cs プロジェクト: jokalee/Amalgam
 private void CloseDirectoryEnumeration(CallbackFileSystem Sender, CbFsFileInfo directoryInfo, CbFsDirectoryEnumerationInfo directoryEnumerationInfo)
 {
     CBFSWinUtil.Invoke("CloseDirectoryEnumeration", () => CloseDirectoryEnumeration(directoryInfo, directoryEnumerationInfo));
 }
コード例 #4
0
ファイル: ICBFSFuncs.cs プロジェクト: jokalee/Amalgam
 public abstract void EnumerateDirectory(CbFsFileInfo directoryInfo, CbFsHandleInfo HandleInfo,
                                         CbFsDirectoryEnumerationInfo DirectoryEnumerationInfo, string Mask, bool Restart,
                                         ref bool FileFound, ref string FileName, ref string ShortFileName,
                                         ref DateTime CreationTime, ref DateTime LastAccessTime, ref DateTime LastWriteTime, ref long lengthOfFile,
                                         ref long AllocationSize, ref CBFS_LARGE_INTEGER FileId, ref uint FileAttributes);
コード例 #5
0
ファイル: OccamDriveForm.cs プロジェクト: exinno/occam-drive
        private void CbFsEnumerateDirectory(
            object sender,
            CbFsFileInfo DirectoryInfo,
			CbFsHandleInfo HandleInfo,
			CbFsDirectoryEnumerationInfo EnumerationInfo,
            string Mask,
            int Index,
            bool Restart,
            ref bool FileFound,
            ref string FileName,
            ref string ShortFileName,
            ref DateTime CreationTime,
            ref DateTime LastAccessTime,
            ref DateTime LastWriteTime,
            ref long EndOfFile,
            ref long AllocationSize,
            ref CBFS_LARGE_INTEGER FileId,
            ref uint FileAttributes
            )
        {
            //Console.WriteLine("{0}::{1}", "CbFsEnumerateDirectory", "Event Call.....");
            //Console.WriteLine("{0}::{1}::{2}", "CbFsEnumerateDirectory \t DirectoryInfo.FileName", DirectoryInfo.FileName, Mask);

            bool ResetEnumeration = false;
            bool ExactMatch = false;
            FileFound = false;
            ENUM_INFO pInfo = null;
            VirtualFile vfile = null, vdir = null;

            ExactMatch = !Mask.Equals("*");

            if ((Restart || EnumerationInfo.UserContext == IntPtr.Zero) && !ExactMatch) {
                ResetEnumeration = true;
                //Console.WriteLine("{0}", " \t Restart.");
            }

            if (Restart && (EnumerationInfo.UserContext != IntPtr.Zero)) {
                if (GCHandle.FromIntPtr(EnumerationInfo.UserContext).IsAllocated) {
                    GCHandle.FromIntPtr(EnumerationInfo.UserContext).Free();
                }
                EnumerationInfo.UserContext = IntPtr.Zero;
                //Console.WriteLine("{0}", " \t EnumerationInfo.UserContext = IntPtr.Zero");
            }

            if (EnumerationInfo.UserContext.Equals(IntPtr.Zero)) {

                //Console.WriteLine("{0}::{1}", "\t Restart", Restart);

                pInfo = new ENUM_INFO();

                GCHandle gch = GCHandle.Alloc(pInfo);

                EnumerationInfo.UserContext = GCHandle.ToIntPtr(gch);

                FindVirtualFile(DirectoryInfo.FileName, ref vdir);

                //Mask가 * 이 아니면 파일 실행시이다.
                //

                // 전체(*)를 가져와야 할 경우 Web에서 리스트를 가져온다, 파일 실행 시 제외.

                if (!ExactMatch && vdir.CanLoadList()) {
                    // occam 에서 리스트 가져오기
                    ListDirectory occamList = g_OccamFile.getList(DirectoryInfo.FileName);
                    int count = occamList.Total;

                    vdir.SetLoadListTime();

                    for (int i = 0; i < count; i++) {
                        string fileName = occamList.Data[i].Name.Replace("/", "\\");

                        VirtualFile replaceVfile = null;
                        if (vdir.Context.GetFile(fileName, ref replaceVfile) == false) {
                            // 새로 만들기
                            replaceVfile = new VirtualFile(GetFileName(fileName));//, contentSize);
                            replaceVfile.Attributes = (FileAttributes)(occamList.Data[i].ItemType.Equals("Folder") ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL);
                            replaceVfile.EndOfFile = occamList.Data[i].ContentSize;
                            replaceVfile.CreationTime = Convert.ToDateTime(occamList.Data[i].CreatedDate);
                            replaceVfile.LastAccessTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate);
                            replaceVfile.LastWriteTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate); // TODO : writetime 값 가져오기

                            replaceVfile.Waiting();
                            vdir.AddFile(replaceVfile);
                        } else if (replaceVfile.EndOfFile != occamList.Data[i].ContentSize) {
                            // reset
                            replaceVfile.Attributes = (FileAttributes)(occamList.Data[i].ItemType.Equals("Folder") ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL);
                            replaceVfile.EndOfFile = occamList.Data[i].ContentSize;
                            replaceVfile.CreationTime = Convert.ToDateTime(occamList.Data[i].CreatedDate);
                            replaceVfile.LastAccessTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate);
                            replaceVfile.LastWriteTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate); // TODO : writetime 값 가져오기

                            replaceVfile.Waiting();
                            vdir.AddFile(replaceVfile);
                        }
                    }

                    // vdir file count loop
                    int vCount = vdir.Context.GetCount();

                    for (int i = 0; i < vCount; i++) {
                        VirtualFile replaceVfile = null;
                        vdir.Context.GetFile(i, ref replaceVfile);

                        Item OccamData = null;
                        if (occamList.GetItem(replaceVfile.Name, ref OccamData) == false) {
                            //remove
                            if(replaceVfile.GetVFStatus.Equals(VirtualFileStatus.Waiting)) {
                                vdir.Context.Remove(replaceVfile);
                            }
                        }
                    }
                }

                pInfo.vfile = vdir;

                //Console.WriteLine("{0}", " \t create a vfile.");

            } else {
                pInfo = (ENUM_INFO)GCHandle.FromIntPtr(EnumerationInfo.UserContext).Target;

                vdir = pInfo.vfile;

                //Console.WriteLine("{0}", " \t EnumerationInfo.UserContext use.");
            }

            if (ResetEnumeration) {
                pInfo.Index = 0;
                //Console.WriteLine("{0}", " \t pInfo.Index = 0");
            } else {
                //Console.WriteLine("{0}::{1}", "pInfo.Index", pInfo.Index);
            }

            if (pInfo.ExactMatch == true) {
                FileFound = false;
                //Console.WriteLine("{0}", " \t File found.");
            } else {
                FileFound = ExactMatch ?
                    vdir.Context.GetFile(Mask, ref vfile) : vdir.Context.GetFile(pInfo.Index, ref vfile);
                //Console.WriteLine("{0}", " \t file not found.");
            }

            if (FileFound) {
                //Console.WriteLine("{0}::{1}", " \t create file", vfile.Name);
                FileName = vfile.Name;

                CreationTime = vfile.CreationTime;

                LastAccessTime = vfile.LastAccessTime;

                LastWriteTime = vfile.LastWriteTime;

                EndOfFile = vfile.EndOfFile;

                AllocationSize = vfile.AllocationSize;

                FileId.QuadPart = 0;

                FileAttributes = Convert.ToUInt32(vfile.Attributes);

            }
            pInfo.ExactMatch = ExactMatch;
            ++pInfo.Index;
        }
コード例 #6
0
ファイル: OccamDriveForm.cs プロジェクト: exinno/occam-drive
 private void CbFsCloseDirectoryEnumeration(object sender, CbFsFileInfo DirectoryInfo, CbFsDirectoryEnumerationInfo EnumerationInfo)
 {
     //Console.WriteLine("{0}::{1}", "CbFsCloseDirectoryEnumeration", "Event Call.....");
     if (!EnumerationInfo.UserContext.Equals(IntPtr.Zero))
     {
         if (GCHandle.FromIntPtr(EnumerationInfo.UserContext).IsAllocated)
         {
             ENUM_INFO pInfo = (ENUM_INFO)GCHandle.FromIntPtr(EnumerationInfo.UserContext).Target;
             GCHandle.FromIntPtr(EnumerationInfo.UserContext).Free();
         }
     }
 }