C# FindFirstFile win32API (转)

  private void button2_Click(object sender, EventArgs e)
        {
            WIN32_FIND_DATA FindFileData1 = new WIN32_FIND_DATA();
            var file = "C:\\Windows\\System32\\osk.exe";
            //以32位方式编译 找不到文件 。。。  
            var hFind = FindFirstFile(file, ref FindFileData1);


        }

        #region 声明WIN32API函数以及结构 **************************************
        [Serializable,
        System.Runtime.InteropServices.StructLayout
          (System.Runtime.InteropServices.LayoutKind.Sequential,
          CharSet = System.Runtime.InteropServices.CharSet.Auto
          ),
        System.Runtime.InteropServices.BestFitMapping(false)]
        private struct WIN32_FIND_DATA
        {
            public int dwFileAttributes;
            public int ftCreationTime_dwLowDateTime;
            public int ftCreationTime_dwHighDateTime;
            public int ftLastAccessTime_dwLowDateTime;
            public int ftLastAccessTime_dwHighDateTime;
            public int ftLastWriteTime_dwLowDateTime;
            public int ftLastWriteTime_dwHighDateTime;
            public int nFileSizeHigh;
            public int nFileSizeLow;
            public int dwReserved0;
            public int dwReserved1;
            [System.Runtime.InteropServices.MarshalAs
              (System.Runtime.InteropServices.UnmanagedType.ByValTStr,
              SizeConst = 260)]
            public string cFileName;
            [System.Runtime.InteropServices.MarshalAs
              (System.Runtime.InteropServices.UnmanagedType.ByValTStr,
              SizeConst = 14)]
            public string cAlternateFileName;
        }
        [System.Runtime.InteropServices.DllImport
          ("kernel32.dll",
          CharSet = System.Runtime.InteropServices.CharSet.Auto,
          SetLastError = true)]
        private static extern IntPtr FindFirstFile(string pFileName, ref WIN32_FIND_DATA pFindFileData);
        [System.Runtime.InteropServices.DllImport
          ("kernel32.dll",
          CharSet = System.Runtime.InteropServices.CharSet.Auto,
          SetLastError = true)]
        private static extern bool FindNextFile(IntPtr hndFindFile, ref WIN32_FIND_DATA lpFindFileData);
        [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool FindClose(IntPtr hndFindFile);
        #endregion

        //具体方法函数

        Stack<string> m_scopes = new Stack<string>();
        private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
        WIN32_FIND_DATA FindFileData;
        private System.IntPtr hFind = INVALID_HANDLE_VALUE;
        void FindFileInDir(string rootDir)
        {
            string path = rootDir;
            start:
            new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Path.Combine(path, ".")).Demand();
            if (path[path.Length - 1] != '\\')
            {
                path = path + "\\";
            }
            //Response.Write("文件夹为:" + path + "<br>");
            hFind = FindFirstFile(Path.Combine(path, "*"), ref FindFileData);
            if (hFind != INVALID_HANDLE_VALUE)
            {
                do
                {
                    if (FindFileData.cFileName.Equals(@".") || FindFileData.cFileName.Equals(@".."))
                        continue;
                    if ((FindFileData.dwFileAttributes & 0x10) != 0)
                    {
                        m_scopes.Push(Path.Combine(path, FindFileData.cFileName));
                    }
                    else
                    {
                        //Response.Write(FindFileData.cFileName + "<br>");
                    }
                }
                while (FindNextFile(hFind, ref FindFileData));
            }
            FindClose(hFind);
            if (m_scopes.Count > 0)
            {
                path = m_scopes.Pop();
                goto start;
            }
        }

转自 https://www.cnblogs.com/dekevin/p/3926608.html

posted @ 2020-01-10 17:07  enych  阅读(367)  评论(0编辑  收藏  举报