【问题标题】:How to create a FILE in Desktop, using c [closed]如何在桌面中创建文件,使用 c [关闭]
【发布时间】:2017-04-10 10:18:25
【问题描述】:

在桌面中创建和操作 FILE 需要如何以及需要哪些库?仅使用 C,而不是 C# 或 C++。 我正在使用 Codeblocks,我使用 allegro,这意味着我不能使用 windows.h lib,该程序需要在 windows 中运行。

【问题讨论】:

  • 这取决于...您想使用 Windows API (CreateFile())、POSIX-ish API(_open()_sopen_s())还是 ISO 标准 C(fopen() )?当然,您也可以使用第三方库,例如 GLib,尽管您可能没有将它们安装在编译器默认可以找到它们的地方,如果它们已经安装的话。跨度>
  • 我想用fopen,我不能用lib windows.h,为什么我在程序中使用allegro。
  • 没有windows库和头文件就无法编写Windows程序。或者您需要跨平台解决方案。使用allegro标签询问有关allegro的问题。

标签: c windows file desktop


【解决方案1】:

在 Windows Vista 或更高版本中,使用SHGetKnownFolderPath 查找桌面路径。您必须使用 Unicode 函数来获取文件路径,使用 _wfopen_s。您可以将ANSI写入文件,但建议写入UTF16或将文本转换为UTF8。

#include <stdio.h>
#include <Windows.h>
#include <Shlobj.h>

int main()
{
    wchar_t *desktop;
    if(S_OK == SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &desktop))
    {
        wprintf(L"Desktop path: %s\n", desktop);

        wchar_t filename[MAX_PATH];
        swprintf_s(filename, MAX_PATH, L"%s\\%s", desktop, L"file.txt");
        wprintf(L"Filename path: %s\n", filename);

        FILE *fp;
        _wfopen_s(&fp, filename, L"w");
        if(fp)
        {
            fprintf(fp, "Hello world\n");
            fclose(fp);
        }
        else
        {
            wprintf(L"can't create file\n");
        }

        CoTaskMemFree(desktop);
    }

    return 0;
}

在 Windows XP 中使用 SHGetSpecialFolderPath(已弃用)

#include <stdio.h>
#include <Windows.h>
#include <Shlobj.h>

int main()
{
    wchar_t desktop[MAX_PATH];
    if(SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_DESKTOP | CSIDL_FLAG_CREATE, NULL, 0, desktop)))
    {
        wprintf(L"desktop: %s\n", desktop);
        wchar_t path[MAX_PATH];
        swprintf(path, L"%s\\%s", desktop, L"filename.txt");

        HANDLE handle = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if(handle != INVALID_HANDLE_VALUE)
        {
            DWORD temp;
            const char *buf = "hello world";
            WriteFile(handle, buf, strlen(buf), &temp, NULL);
            CloseHandle(handle);
        }
        else
        {
            printf("can't create file\n");
        }
    }
    return 0;
}

【讨论】:

  • 当我编译你的程序时,appers FOLDERID_Desktop undeclarete。
  • @DavidAmatoMantegari 在 MinGW 目标上,您应该在 knownfolders.h 头文件中找到它,该文件自动包含在上面的 Windows.hShlobj.h 之一中。要使SHGetKnownFolderPath() 工作,我必须在任何其他包含之前添加#include &lt;sdkddkver.h&gt;#define _WIN32_WINNT _WIN32_WINNT_VISTA,并将-lole32-luuid 添加到我的编译行末尾,以链接找到符号所需的库。
【解决方案2】:

1 如果你使用的是 Unix 或类 Unix 系统,你可以调用

system("touch ~/Desktop/FILE");

在您的代码中,您需要#include &lt;stdlib.h&gt;

这将调用命令“touch ~/Desktop/FILE”。如果您想在此之后处理(读/写)文件,您必须以正确的模式调用fopen。但是如果你想在文件中写入一些东西,第二种方法要好得多。


2 你也可以使用

对于 Unix 或类 Unix 操作系统: FILE *file = fopen("~/Desktop/FILE", "w+")

对于 Windows: FILE *file = fopen("C:\\Users\\YOUR_USER_NAME\\Desktop\\FILE", "w+") (*假设您使用的是默认用户文件夹位置。)

这将创建文件,然后您可以在此之后读取/写入文件。请务必使用正确的模式。 Herefopen 和模式的参考。记得#include &lt;stdlib.h&gt;

【讨论】:

    【解决方案3】:

    鉴于您使用的是 Windows,您可能想查看 CreateFile 及其相关函数。

    文件的生命周期如下:你可以使用CreateFile创建它(或者,如果它存在,打开它),一旦它被创建/打开,你就可以使用生成的文件句柄 使用ReadFileWriteFile 和可能的DeleteFile 操作它。完成后,您需要使用CloseHandle 关闭句柄。

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多