선언:

CreateFile (C#)
[DllImport("kernel32")]
static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

CreateFile (VB.NET)
<DllImport("kernel32")> _
Shared Function CreateFile(ByVal lpFileName As StringByVal dwDesiredAccess As UIntegerByVal dwShareMode As UIntegerByVal lpSecurityAttributes As IntPtr, ByVal dwCreationDisposition As UIntegerByVal dwFlagsAndAttributes As UIntegerByVal hTemplateFile As IntPtr) As IntPtr
End Function



사용 예제:

CreateFile API 예제 코드 (C#)
using System;
using System.Runtime.InteropServices;

namespace ApiReference {
    class ApiExample {
        [DllImport("kernel32")]
        static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
        [DllImport("kernel32")]
        static extern void CloseHandle(IntPtr hObject);
        const uint CREATE_ALWAYS    = 0x00000001;
        const uint GENERIC_WRITE    = 0x40000000;
        const uint GENERIC_READ        = 0x80000000;
        
        public static void Main(string[] args) {
            IntPtr hFile = CreateFile(@"C:\text.txt", GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, CREATE_ALWAYS, (uint) System.IO.FileAttributes.Normal, IntPtr.Zero);
            if ( hFile != IntPtr.Zero ) {
                Console.WriteLine("C 드라이브 밑에 test.txt 파일이 생성되었습니다.");
                Console.WriteLine("File.Exists 실행 결과: {0}", System.IO.File.Exists(@"C:\test.txt"));
                CloseHandle(hFile);
            } else Console.WriteLine("파일을 만들지 못했습니다.");
            
            Console.ReadKey(true);
        }
    }
}
예제 코드 (.NET Fiddle)

CreateFile API 예제 코드 (VB.NET)
Imports System
Imports System.Runtime.InteropServices

Namespace ApiReference
    Class ApiExample
        <DllImport("kernel32")> _
        Private Shared Function CreateFile(lpFileName As String, dwDesiredAccess As UInteger, dwShareMode As UInteger, lpSecurityAttributes As IntPtr, dwCreationDisposition As UInteger, dwFlagsAndAttributes As UInteger, _
            hTemplateFile As IntPtr) As IntPtr
        End Function
        <DllImport("kernel32")> _
        Private Shared Sub CloseHandle(hObject As IntPtr)
        End Sub
        Const CREATE_ALWAYS As UInteger = &H1
        Const GENERIC_WRITE As UInteger = &H40000000
        Const GENERIC_READ As UInteger = &H80000000UI

        Public Shared Sub Main(args As String())
            Dim hFile As IntPtr = CreateFile("C:\text.txt", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, CREATE_ALWAYS, CUInt(System.IO.FileAttributes.Normal), IntPtr.Zero)
            If hFile <> IntPtr.Zero Then
                Console.WriteLine("C 드라이브 밑에 test.txt 파일이 생성되었습니다.")
                Console.WriteLine("File.Exists 실행 결과: {0}", System.IO.File.Exists("C:\test.txt"))
                CloseHandle(hFile)
            Else
                Console.WriteLine("파일을 만들지 못했습니다.")
            End If

            Console.ReadKey(True)
        End Sub
    End Class
End Namespace
예제 코드 (.NET Fiddle)




예제 실행 결과:




매개변수 설명(기울임꼴로 표시된 매개변수는 생략 가능합니다):

lpFileName - 생성할 파일 또는 열 장치나 파일의 이름입니다.
dwDesiredAccess - 파일이나 장치를 만들거나 열 때 사용할 권한입니다.
dwShareMode - 파일의 공유 모드를 입력합니다.
lpSecurityAttributes - 파일 또는 장치를 열 때 사용할 보안 특성(Security Attributes)을 입력합니다. (비고 참조)
dwCreationDisposition - 파일이나 장치를 열 때 취할 행동입니다. (비고 참조)
dwFlagsAndAttributes - 파일이나 장치를 열 때 또는 만들 때 파일이나 장치가 갖게 될 특성을 입력합니다.
hTemplateFile - 만들어질 파일이 갖게 될 특성 및 확장 특성에 대한 정보를 가지고 있는 템플릿 파일 핸들을 입력합니다. (비고 참조)
이 곳에 매개변수 설명을 입력하세요




API 설명:

파일이나 장치를 만들거나 엽니다.




참고:

CreateFile (MSDN)




문자셋:

CreateFileA (Ansi)
CreateFileW (Unicode)




요구 사항:

Windows XP 이상
Windows Server 2003 이상




비고:

lpFileName 매개변수는 열거나 만들 파일 또는 장치의 이름을 입력합니다. 그리고 이 매개변수에는 슬래시(/)나 백슬래시(\)가 포함될 수 있습니다. CreateFile API의 Ansi 버전에서는 이 매개변수의 길이가 MAX_PATH (260)으로 제한됩니다. 이 제한을 확장하고 싶을 경우에는 CreateFile API의 Unicode 버전을 사용하면 됩니다. 단, 이 때는 경로 앞에 \\?\ 를 붙여줘야 합니다. 스트림을 사용하려고 하는 경우에는 이름의 끝에 콜론과 스트림 명을 지정해주면 됩니다.

>> 파일 이름이 A.txt 이고 data 라는 스트림에 접근하려는 경우에는 CreateFile(“A.txt:data”, …); 와 같이 호출하면 됨


dwShareMode 매개변수는 파일의 공유 모드를 설정합니다. 공유 모드는 READ, WRITE, DELETE 이 세가지가 있으며 0이 전달된 경우에는 공유를 하지 않습니다. 여기서 말하는 공유란 “네트워크 공유“를 말하는 것이 아닌 시스템 내에서의 공유를 말합니다. 일반적으로, 한 프로세스에서 파일을 열 경우 다른 프로세스에서 여는 것이 불가능하지만 공유 모드를 설정한 경우 해당 작업에 대한 실행이 가능합니다. 추가로 DELETE 공유 모드의 경우 파일의 삭제와 이름 변경 작업을 수행할 수 있습니다.


만들어지는 파일에 특정한 권한이나 리소스에 대한 접근을 제한하고 싶은 경우 lpSecurityAttributes 매개변수에 접근 제어 목록(ACL, Access Control List)을 설정한 SECURITY_ATTRIBUTES 구조체를 입력하면 됩니다. 단, 이미 존재하는 장치나 파일을 열 경우 SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버는 무시되고 bInheritHandle 멤버만 사용됩니다.


dwCreationDisposition 매개변수는 파일을 생성하는데 수행할 작업을 결정합니다. CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXISTING 이 사용 가능하며 각각 옵션의 설명은 다음과 같습니다.


CREATE_NEW (1, 0x01): 파일을 만듭니다. 만약, 파일이 이미 존재할 경우에는 ERROR_FILE_EXISTS 오류가 발생합니다.

CREATE_ALWAYS (2, 0x02): 항상 파일을 새로 만듭니다. 파일이 이미 존재할 경우에는 파일을 덮어씌우고 LastError 값을 ERROR_ALREADY_EXISTS로 설정합니다.

OPEN_EXISTING (3, 0x03): 이미 존재하는 파일이나 장치를 엽니다. 파일이나 장치가 존재하지 않을 경우에는 ERROR_FILE_NOT_FOUND 오류가 발생합니다.

OPEN_ALWAYS (4, 0x04): 항상 파일을 엽니다. 파일이 존재할 경우 API 호출이 성공하고 LastError 값을 ERROR_ALREADY_EXISTS로 설정합니다. 만약, 파일이 존재하지 않지만 쓰기 가능한 유효한 경로가 입력된 경우 파일을 새로 만듭니다.

TRUNCATE_EXISTING (5, 0x05): 파일을 열고, 내용을 0바이트로 자릅니다. 파일이 존재하지 않을 경우에는 ERROR_FILE_NOT_FOUND 오류가 발생합니다. 이 옵션은 반드시 GENERIC_WRITE 권한이 있어야 합니다.
OPEN_EXISTING 옵션은 주로 장치를 열 때 사용합니다.


dwFlagsAndAttributes 매개변수는 파일의 옵션이나 특성을 설정합니다. 보통 CreateFile API를 파일 대상으로 사용할 경우에는 FILE_ATTRIBUTE_NORMAL 값을 주로 사용합니다. 이 매개변수에는 System.IO.FileAttributes 열거형 상수를 사용할 수 있습니다.

hTemplateFile 매개변수는 GENERIC_READ 권한을 가지고 있는 파일 핸들을 입력합니다. 템플릿 파일은 만들어질 파일에 파일 특성과 확장 특성(Extended Attributes)을 제공합니다. 이미 존재하는 파일을 열 경우 이 매개변수는 무시됩니다.




Powered by SlaneR & TeamDEV Korea


'API Reference' 카테고리의 다른 글

58. SystemFunction041 (RtlDecryptMemory)  (0) 2015.09.27
57. SystemFunction040 (RtlEncryptMemory)  (0) 2015.09.26
55. AccessMask  (0) 2015.09.13
54. ShowWindow  (0) 2015.01.04
53. FindWindow  (1) 2015.01.04

+ Recent posts