xj qian
2025-02-11 0792cf13f1a288644a9a90c023547bbe6e26a3e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#pragma once
 
#include "system/base.hpp"
#include "win.hpp"
#include "wobject/xstring.hpp"
 
#if _XWIN
#define CALLBACK    __stdcall
#define MAX_PATH    260
 
typedef void* LPSECURITY_ATTRIBUTES;
typedef UINT_PTR(CALLBACK* LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
struct OPENFILENAMEW
{
    DWORD        lStructSize;
    HWND         hwndOwner;
    HINSTANCE    hInstance;
    LPCWSTR      lpstrFilter;
    LPWSTR       lpstrCustomFilter;
    DWORD        nMaxCustFilter;
    DWORD        nFilterIndex;
    LPWSTR       lpstrFile;
    DWORD        nMaxFile;
    LPWSTR       lpstrFileTitle;
    DWORD        nMaxFileTitle;
    LPCWSTR      lpstrInitialDir;
    LPCWSTR      lpstrTitle;
    DWORD        Flags;
    WORD         nFileOffset;
    WORD         nFileExtension;
    LPCWSTR      lpstrDefExt;
    LPARAM       lCustData;
    LPOFNHOOKPROC lpfnHook;
    LPCWSTR      lpTemplateName;
 
    void* pvReserved;
    DWORD        dwReserved;
    DWORD        FlagsEx;
};
 
//FILETIME½á¹¹³ÖÓеÄ64λÎÞ·ûºÅµÄÎļþµÄÈÕÆÚºÍʱ¼äÖµ¡£Í·Îļþ: WINDEF.H
struct FILETIME
{
    int dwLowDateTime; // µÍ 32 Î»  
    int dwHighDateTime; // ¸ß 32 Î»  
};
 
#if 0
struct fileinfo : public xstruct
{
    char[128] szFileTitle; //ÎļþµÄ±êÌâÃû
    int dwFileAttributes; //ÎļþµÄÊôÐÔ
    FILETIME ftCreationTime; //ÎļþµÄ´´½¨Ê±¼ä
    FILETIME ftLastAccessTime; //ÎļþµÄ×îºó·ÃÎÊʱ¼ä
    FILETIME ftLastWriteTime; //ÎļþµÄ×îºóÐÞ¸Äʱ¼ä
    int nFileSizeHigh; //Îļþ´óСµÄ¸ßλ˫×Ö
    int nFileSizeLow; //Îļþ´óСµÄµÍλ˫×Ö
    int dwReserved0; //±£Áô£¬Îª0
    int dwReserved1; //±£Áô£¬Îª0
};
#endif
 
typedef struct _WIN32_FIND_DATAW {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR  cFileName[MAX_PATH];
    WCHAR  cAlternateFileName[14];
} WIN32_FIND_DATAW;
 
 
extern "C"
{
    //namespace win32
    //{
        bool  WINAPI GetSaveFileNameW(OPENFILENAMEW*);//native from "comdlg32.dll" alias "GetSaveFileNameW";
        bool  WINAPI GetOpenFileNameW(OPENFILENAMEW*);//native from "comdlg32.dll" alias "GetOpenFileNameW";
 
        HANDLE WINAPI FindFirstFileW(const WCHAR* lpFileName, WIN32_FIND_DATAW* lpFindFileData); //native from "kernel32.dll" alias "FindFirstFileW";    //¸ù¾ÝÎļþÃû²éÕÒÎļþ,Ò»µ©²»ÔÙÐèÒª£¬Ó¦¸ÃÓÃFindCloseº¯Êý¹Ø±ÕÕâ¸ö¾ä±ú
        BOOL WINAPI FindNextFileW(HANDLE hFindFile, WIN32_FIND_DATAW* lpFindFileData); //native from "kernel32.dll" alias "FindNextFileW";    //¼ÌÐø²éÕÒFindFirstFileº¯ÊýËÑË÷ºóµÄÎļþ ,HANDLE hFindFileËÑË÷µÄÎļþ¾ä±ú º¯ÊýÖ´ÐеÄʱºòËÑË÷µÄÊǴ˾ä±úµÄÏÂÒ»Îļþ¡£·ÇÁã±íʾ³É¹¦£¬Áã±íʾʧ°Ü¡£Èç²»ÔÙÓÐÓëÖ¸¶¨Ìõ¼þÏà·ûµÄÎļþ£¬»á½«GetLastErrorÉèÖóÉERROR_NO_MORE_FILES
        bool  WINAPI FindClose(HANDLE hFindFile); //native from "kernel32.dll" alias "FindClose";    //¹Ø±ÕÓÉFindFirstFileº¯Êý´´½¨µÄÒ»¸öËÑË÷¾ä±ú¡£·µ»Ø·ÇÁã±íʾ³É¹¦£¬Áã±íʾʧ°Ü¡£»áÉèÖÃGetLastError 
 
        HANDLE  WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); //native from "kernel32.dll" alias "CreateFileW";
        HFILE  WINAPI  OpenFile(LPCSTR lpFileName, OFSTRUCT* lpReOpenBuff, UINT wStyle); //native from "kernel32.dll" alias "OpenFile";
        int  WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, LONG* lpDistanceToMoveHigh, DWORD dwMoveMethod); //native from "kernel32.dll" alias "SetFilePointer";
        int  WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); //native from "kernel32.dll" alias "ReadFile";
        int  WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); //native from "kernel32.dll" alias "ReadFile";
        int  WINAPI CloseHandle(HANDLE hFile); //native from "kernel32.dll" alias "CloseHandle";
        int  WINAPI GetFileSize(HANDLE hFile, DWORD* lpFileSizeHigh); //native from "kernel32.dll" alias "GetFileSize";
    //}
}
#endif
 
 
class xfile
{
public:
    static bool  GetSaveFileName(OPENFILENAMEW& OpenFileName)
    {
        return ::GetSaveFileNameW(&OpenFileName);
    }
    static bool GetOpenFileName(OPENFILENAMEW& SaveFileName)
    {
        return ::GetOpenFileNameW(&SaveFileName);
    }
 
    static HANDLE FindFirstFile(const WCHAR* lpFileName, WIN32_FIND_DATAW& lpFindFileData)
    {
        return ::FindFirstFileW(lpFileName, &lpFindFileData);
    }
 
    static BOOL FindNextFile(HANDLE hFindFile, WIN32_FIND_DATAW& lpFindFileData)
    {
        return ::FindNextFileW(hFindFile, &lpFindFileData);
    }
    static bool FindClose(HANDLE hFindFile)
    {
        return ::FindClose(hFindFile);
    }
 
    static HANDLE  CreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
    {
        return ::CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
    }
 
    static HFILE  OpenFile(LPCSTR lpFileName, OFSTRUCT& lpReOpenBuff, UINT wStyle)
    {
        return ::OpenFile(lpFileName, &lpReOpenBuff, wStyle);
    }
    static int  SetFilePointer(HANDLE hFile, LONG lDistanceToMove, LONG* lpDistanceToMoveHigh, DWORD dwMoveMethod)
    {
        return ::SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
    }
    static int  ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
    {
        return ::ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
    }
    static int  WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
    {
        return ::WriteFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
    }
    static int  CloseHandle(HANDLE hFile)
    {
        return  ::CloseHandle(hFile);
    }
    static int  GetFileSize(HANDLE hFile, DWORD& lpFileSizeHigh)
    {
        return ::GetFileSize(hFile, &lpFileSizeHigh);
    }
 
    static xstring GetString(xstring path);
    static BYTE* GetBuffer(xstring path,int& Length);
};