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++的几个小代码示例
另外,我已经读过关于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