發布:2023-06-06 19:48:00編輯:視頻君來源:視頻教程網
{
AnsiString FileName="e:\\1.txt";
HANDLE TheFile;
TheFile=CreatFile(FileName.c_str().GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(TheFile==INVALID_HANDLE_VALUE)
{
ShowMessage("無法新建文件!");
return;
}
::CloseHandle(TheFile);
}
C語言的函數 可以和Turbo C的函數做同一個理解,
Turbo C 是在DOS環境下運行的,是一個8位的C語言環境,
WIN32 API 顧名思義 是在32位的環境下運行的,
如此 Turbo C顯然不能調用WIN32的API
如果你是初學者,想學習C語言。
強烈建議你先用Turbo C處理書本上一些例題。
然后用VC學習API
用VC理由如下:
1、WIN32 API屬于微軟,當然要用微軟公司開發的VC。
2、網絡上鋪天蓋地的電子書、視頻都是關于VC的。
3、企業基本都在用windows操作系統
至于什么DEV C;WINNER C; BOLAND C++建議根本不要碰——浪費時間……
最后 祝你好運!
1、CreateFile 是一個多功能的函數,可打開或創建以下對象,并返回可訪問的句柄:控制臺,通信資源,目錄(只讀打開),磁盤驅動器,文件,郵槽,管道。 2、例程: #include int main(){ HANDLE hf = CreateFile(TEXT("C:\\testa.bin"), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); DWORD written; WriteFile(hf, "\x0f\xff\xff\xff\xff\xff", 6, &written, 0); CloseHandle(hf); hf = CreateFile(TEXT("c:\\testb.bin"), GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0); SetFilePointer(hf, 0, 0, FILE_END); WriteFile(hf, "\x0f\xff\xff\xff\xff\xff", 6, &written, 0); CloseHandle(hf); return 0;}
一、在VB中聲明API函數有兩種方法:如果我們只在某個窗體中使用API函數,我們可以在窗體代碼的General部分聲明它: 聲明的語法是: Private Declare Function ... Private Declare Sub..... 這里必須采用Private聲明,因為這個API函數只能被一個窗體內的程序所調用。 如果我們的程序有多個窗體構成,而且我們需要在多個窗體中使用同一個API函數,就需要在模塊中聲明了。 先添加一個模塊(如圖示), 然后采用如下語法聲明: Public Declare Function.... Public Declare Sub.... Public聲明的含義是把API函數作為一個公共函數或過程,在一個工程中的任何位置(包括所有的窗體和模塊)都能直接調用它。 聲明完畢我們就能在程序中使用此API函數了。 二、可采用以下幾種方式使用API函數,以SetWindowPos函數為例: (1)忽略函數返回值的調用: SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3 注意此時函數的參數是不加括號的。 (2)Call方法調用: Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3) 注意這里需要加上括號,但我們不取回函數的返回值。 (3)取得函數返回值的調用: MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3) 此時需要加上括號,而且我們必須事先定義一個變量(變量的類型與函數返回值類型相同)來存儲API函數的返回值。 三、幾個問題的說明: (1)聲明中的Lib 和 Alias 是怎么回事 一般情況下WIN32API函數總是包含在Windows系統自帶的或是其它公司提供的動態連接庫DLL中,而Declare語句中的Lib關鍵字就用來指定DLL(動態連接庫)文件的路徑,這樣VB才能找到這個DLL文件,然后才能使用其中的API函數。如果我們只是列出DLL文件名而不指出其完整的路徑的話,VB會自動到.EXE文件所在目錄、當前工作目錄、WINDOWS\SYSTEM目錄、WINDOWS目錄下搜尋這個DLL文件。所以如果所要使用DLL文件不在上述幾個目錄下的話,我們應該指明其完整路徑。 Alias用于指定API函數的別名,如果我們調用的API函數要使用字符串(參數中包含String型)的話,Alias關鍵字是必須的。這是因為在ANSI和Unicode字符集中同一API函數的名稱可能是不一樣的,為了保證不出現聲明錯誤,我們使用Alias關鍵字指出API函數的別名,一般來說在WIN9X平臺下我們把API函數名后加一個大寫A作為別名即可。 (2)常見的API參數類型的說明 API函數的參數中最常見的是長整Long型數據類型,例如API中的句柄、一些特定的常量、函數的返回值都是此類型 的值;另外幾種常見的參數類型有:整型Integer、Byte型、String型等。 (3)聲明中的ByVal是作什么用的 這跟VB的參數傳遞方式有關,在默認情況下VB是通過地址傳遞方式傳遞函數的參數、而有些API函數要求必須采用傳值方式來傳遞函數參數(這兩種參數傳遞方式是不同的,前者傳遞的是一個指針,而后者要求是參數真實的值)。這樣就會發生錯誤,解決的辦法是在API函數參數聲明的前面加上ByVal關鍵字,這樣VB就采用傳值方式傳遞參數了。 (4)怎樣得到完整的API函數聲明 VB自帶了API文本查看器API TEXT VIEWER,我們可以在其中找到API函數的完整聲明,然后把它粘貼到程序中即可。 如下所示: Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
使用CreateFile函數來判斷文件是否打開,編寫以下函數就可以判斷文件是否已打開了,代碼如下:
function IsFileInUse(AName: string): boolean;
var
hFileRes: HFILE;
begin
Result := False;
if not FileExists(AName) then exit;
hFileRes := CreateFile(PChar(AName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result := hFileRes = INVALID_HANDLE_VALUE;
if not Result then
CloseHandle(hFileRes);
end;
使用方式:
if IsFileInUse('d:\test.txt') then
ShowMessage('文件在使用.');
else
ShowMessage('文件沒有使用.');
CreateFile函數說明:
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指針
DWORD dwDesiredAccess, //訪問模式(寫/讀)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全屬性的指針
DWORD dwCreationDisposition, //如何創建
DWORD dwFlagsAndAttributes, //文件屬性
HANDLE hTemplateFile //用于復制文件句柄
);
參數列表
lpFileName String 要打開的文件的名字
dwDesiredAccess Long 如果為 GENERIC_READ 表示允許對設備進行讀訪問;如果為
GENERIC_WRITE 表示允許對設備進行寫訪問(可組合使用);如果為零,表示只允許獲取與一個設備有關的信息
dwShareMode Long, 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE
表示允許對文件進行共享訪問
lpSecurityAttributes SECURITY_ATTRIBUTES,
指向一個SECURITY_ATTRIBUTES結構的指針,定義了文件的安全特性(如果操作系統支持的話)
dwCreationDisposition Long,下述常數之一:
CREATE_NEW 創建文件;如文件存在則會出錯
CREATE_ALWAYS 創建文件,會改寫前一個文件
OPEN_EXISTING 文件必須已經存在。由設備提出要求
OPEN_ALWAYS 如文件不存在則創建它
TRUNCATE_EXISTING 講現有文件縮短為零長度
dwFlagsAndAttributes Long, 一個或多個下述常數
FILE_ATTRIBUTE_ARCHIVE 標記歸檔屬性
FILE_ATTRIBUTE_COMPRESSED 將文件標記為已壓縮,或者標記為文件在目錄中的默認壓縮方式
FILE_ATTRIBUTE_NORMAL 默認屬性
FILE_ATTRIBUTE_HIDDEN 隱藏文件或目錄
FILE_ATTRIBUTE_READONLY 文件為只讀
FILE_ATTRIBUTE_SYSTEM 文件為系統文件
FILE_FLAG_WRITE_THROUGH 操作系統不得推遲對文件的寫操作
FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作
FILE_FLAG_NO_BUFFERING 禁止對文件進行緩沖處理。文件只能寫入磁盤卷的扇區塊
FILE_FLAG_RANDOM_ACCESS 針對隨機訪問對文件緩沖進行優化
FILE_FLAG_SEQUENTIAL_SCAN 針對連續訪問對文件緩沖進行優化
FILE_FLAG_DELETE_ON_CLOSE 關閉了上一次打開的句柄后,將文件刪除。特別適合臨時文件
也可在Windows NT下組合使用下述常數標記:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION,
SECURITY_IMPERSONATION, SECURITY_DELEGATION,
SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
hTemplateFile Long, 如果不為零,則指定一個文件句柄。新文件將從這個文件中復制擴展屬性
返回值
如執行成功,則返回文件句柄。
INVALID_HANDLE_VALUE表示出錯,會設置GetLastError。即使函數成功,但若文件存在,且指定了CREATE_ALWAYS
或 OPEN_ALWAYS,GetLastError也會設為ERROR_ALREADY_EXISTS
你看看你寫的這句“if FileExists(pchar(extractFilePath(application.exeName)+'newFile\123.txt')); ”,后面還帶了一個分號“;” ,你先把問題弄好再往下看吧~,首先如果在想在某個文件夾中創建文本話,你首先得保證這個文件夾的存在,要不怎么找到他的路徑?然后你寫的“memo1.Lines.SaveToFile(extractFilePath(application.exeName)+'newFile\123.txt'); ”,里面根本用不到pchar你為什么畫蛇添足??你知道pchar和string有什么不同嗎?不懂不要亂用好不?然后下面的代碼
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.SaveToFile(extractFilePath(application.exeName)+'newFile\123.txt');
if FileExists(extractFilePath(application.exeName)+'newFile\123.txt')
then
label2.Caption :='創建成功'
else
label2.Caption :='創建失敗';
end;
上面的代碼可以在一個已經存在的newfile文件夾下創建123.txt并寫入內容(無論newfile文件夾下有幾個txt,只要windows允許就行)!