【问题标题】:FILE vs HANDLE - what is the difference between these two thingsFILE vs HANDLE - 这两件事有什么区别
【发布时间】:2020-03-09 11:25:15
【问题描述】:

所以,我在 Windows 上运行,需要计算文件的大小。

SO 在很多地方都提到了GetFileSize,这需要HANDLE。我习惯于使用从fopen 返回的FILEs 等。

  1. FILE 和 Windows HANDLE 有什么区别?什么时候应该使用它们?
  2. 例如,我可以将一个从fopen 获得的普通FILE 传递给GetFileSize 吗?还是我需要使用 Windows 的CreateFile (?) 函数来获取HANDLE 然后将其传入?

【问题讨论】:

  • GetFileSize 也是 windows 独有的功能,不是标准的 c
  • 值得一提的是,stdio.h 最接近的等价物(可以让您传递FILE*)是fseek(SEEK_END),后跟ftell()。其他操作系统上的等价物(在 POSIX 标准中但不是 C 标准,并且不使用FILE*)是fstat()

标签: c windows file


【解决方案1】:

FILE 是一种标准 C 库,专门用于使用 stdio.h 函数处理文件。它不能用于其他任何事情。 C 标准库具有可移植性的优点。

HANDLE 是 Windows API 使用的类似但更广泛的概念,用于在原始指针之上需要抽象层的所有内容。它用于文件、端口、线程、互斥体、事件、管道等。通常:您可以在 WaitForSingleObject 上使用的任何 Windows 资源 - WaitFor... 函数是 Window 让线程有效休眠而不会耗尽 CPU 资源的方式。见What is a Windows Handle?。它仅适用于 Windows API 特定功能,例如 CreateFile

这两种都是“不透明的类型”,应用程序员不知道也不关心它们是如何在内部实现的。

实际上,Windows 的标准 C 库端口只是 Windows API 之上的一个抽象层。所以FILE* fp = fopen("", "w"); 很可能会归结为CreateFile 内部调用。所以据我们所知,FILE 内部可能包含一个HANDLE

【讨论】:

  • fopen 呼叫_open。后者返回一个 C 文件描述符。这反过来包装了一个 Windows 文件句柄,该句柄来自内部 CreateFileW 调用。文件句柄是指内核文件对象。内核对象的句柄还包括在打开句柄时授予对象的访问权限,以及确定句柄是否可以通过CloseHandle 关闭以及它是否可以被子进程继承的标志。
【解决方案2】:

带有HANDLEGetFileSize() 函数是Windows API 的一部分,这意味着它只能用于Windows 程序。

fopen()FILE 是任何标准 C 编译器附带的 C 运行时库的一部分,这意味着使用它们应该独立于操作系统。

您不能将FILE 传递给GetFileSize() 函数,因为HANDLEFILE 是两个不同的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2022-06-10
    • 2011-04-06
    • 2011-05-23
    • 2019-05-15
    相关资源
    最近更新 更多