C# 在自定义程序中使用本机Windows自然顺序排序

C# 在自定义程序中使用本机Windows自然顺序排序,c#,c++,sorting,winapi,dllimport,C#,C++,Sorting,Winapi,Dllimport,作为一名程序员,您可能不得不使用或创建某种字符串比较函数。通常,这些都很简单: function compare(s1, s1) { return s1.toLowerCase() - s2.toLowerCase(); } 这在绝大多数情况下都非常有效。但是,Windows(XP及更高版本)对文件的排序方式不同,而且更好而不是一个糟糕的ASCII实现 如何在自定义程序中创建最小、完整且可验证的本机Windows自然顺序排序示例? 我读到的所有内容都指向使用shlwapi.dll中的strmp

作为一名程序员,您可能不得不使用或创建某种字符串比较函数。通常,这些都很简单:

function compare(s1, s1) { return s1.toLowerCase() - s2.toLowerCase(); }
这在绝大多数情况下都非常有效。但是,Windows(XP及更高版本)对文件的排序方式不同,而且更好而不是一个糟糕的ASCII实现

如何在自定义程序中创建最小、完整且可验证的本机Windows自然顺序排序示例?

我读到的所有内容都指向使用
shlwapi.dll
中的
strmplogicalw
函数。太好了!但是如何在自定义C/C++程序中使用此函数

我对重新实现比较功能不感兴趣。我已经看过、和了。这些无疑是非常接近的近似值,但我只想在我的程序中链接或调用windowsapi函数

以下是我已经研究和尝试过的一些其他东西:

  • 阅读
  • 查找从发布的(假定)完整程序
  • 编译Visual Studio 2010 Express中的几个小代码示例,C++和C版本都是(<代码>致命错误C1190:托管目标代码需要'/CLR选项< /COD>……真的?)
  • 为VisualStudio2012 Express编译几个小代码示例,因为有文章说这将消除先前关于
    /clr
    选项的编译错误,但只得到了一堆不同的编译错误
  • 尝试用MinGW
  • 编译Eclipse C++的几个小代码示例
当我第一次开始研究这个问题时,我想,“这只是Windows API,这将很容易!”我还没有用任何语言编写出一个可用的程序

我做C/C++和Unix/DOS/Windowsshell脚本已经很长时间了,使用API从来没有这么令人讨厌过。你真丢脸,微软


另外,我已经读过关于ASCII排序的文章,但是谢谢。这里有一些肥沃的土壤,可以用来培养一些好的思维


事实证明,使用AutoIt或AutoHotKey可以轻松调用DLL

我已经提炼出一个最简单的工作示例:

Func _StrCmpLogicalW($s1, $s2)
   Return DllCall('shlwapi.dll', 'int', 'StrCmpLogicalW', 'wstr', $s1, 'wstr', $s2)[0]
EndFunc
下面是一个最简单的例子:

就这样!该函数接受两个Sting并返回
-1/0/+1
,与世界上任何其他比较函数一样

将其与排序算法相结合(例如,对于AutoIt),现在您可以创建整个列表

(请不要使用。想想孩子们。)

C++:

#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

#include <algorithm>
#include <vector>
#include <string>
#include <iostream>

bool str_cmp_logical(std::wstring const &lhs, std::wstring const &rhs)
{
    return StrCmpLogicalW(lhs.c_str(), rhs.c_str()) < 1;
}

int main()
{
    std::vector<std::wstring> foo{
        L"20string", L"2string", L"3string", L"st20ring", L"st2ring",
        L"st3ring", L"string2", L"string20", L"string3"
    };

    for (auto const &f : foo)
        std::wcout << f << L' ';
    std::wcout.put(L'\n');

    std::sort(foo.begin(), foo.end(), str_cmp_logical);

    for (auto const &f : foo)
        std::wcout << f << L' ';
    std::wcout.put(L'\n');
}

尝试使用MinGW编译代码失败,因为其软件包
w32api
附带的
版本没有为
strmplogical()提供原型。当我自己宣布时,我明白了

C:\MinGW\bin>"g++.exe" -lshlwapi C:\Users\sword\source\repos\Codefun\main.cpp
C:\Users\sword\AppData\Local\Temp\ccMrmLbD.o:main.cpp:(.text+0x23): undefined reference to `StrCmpLogicalW(wchar_t const*, wchar_t const*)'
collect2.exe: error: ld returned 1 exit status
因此,MinGW附带的库似乎不知道
strmplogicalw()


不过,它应该与Mingw-w64配合使用。

您正在制作什么类型的机器人:)。这实际上是受复制到USB播放器上的音乐文件列表的启发,该播放器在写入文件时按顺序读取这些文件。我天真的ASCII比较非常有效。。。只要轨迹以前导零编号。有一个非常大的文件夹出现了问题,这是因为曲目没有编号,所有的文件都被命名为Funcy。啊,我总是按上次修改的日期排序,所以我按照它们添加到文件系统的顺序获取它们。问题没有提到AutoIt。调用winapi函数确实很简单。这看起来很棒,与我发现的一些早期示例非常吻合。但它直到VS2010才编译。与明戈的日食。表示“忽略#pragma注释[-Wunknown pragmas]”,但直到VS2010才编译。不编译。。。错误消息是什么?为什么(TF)在2017年使用VS2010?“带明的Eclipse说”忽略#pragma注释[-Wunknown pragmas]“添加
shlwapi.lib
作为链接器输入编译器/链接器理解的任何其他方式?尝试添加此库是问题的一部分。文件
shlwapi.h
很容易找到,但是
shlwapi.lib
文件在我的系统中不存在,我不熟悉如何包含它。我的编程背景主要是Linux,Windows API生态系统有些神秘。@JonathanDavidArndt您需要安装以获取编写Windows程序所需的文件(如
shlwapi.h
shlwapi.lib
)。安装时,假设您希望在C++中创建Windows桌面应用程序所需的文件。@ RaymondChen,它使用自己的导入库集合。
C:\MinGW\bin>"g++.exe" -lshlwapi C:\Users\sword\source\repos\Codefun\main.cpp
C:\Users\sword\AppData\Local\Temp\ccMrmLbD.o:main.cpp:(.text+0x23): undefined reference to `StrCmpLogicalW(wchar_t const*, wchar_t const*)'
collect2.exe: error: ld returned 1 exit status