遊びです遊び。
Win32-APIのFindFirstFile/FindNextFile/FindClose
を使ったファイルの列挙をC++/CLIでアセンブリに仕立てる:
#include <windows.h>
#include <string>
using namespace System;
namespace Trial {
public ref class FindFile {
private:
WIN32_FIND_DATAW* fd_;
HANDLE handle_;
public:
FindFile() { fd_ = new WIN32_FIND_DATAW; }
~FindFile() { this->!FindFile(); }
!FindFile() { delete fd_; }
bool FindFirst(String^ filename) {
if ( filename->Length == 0 ) return false;
array<wchar_t>^ buffer = filename->ToCharArray();
pin_ptr<wchar_t> pin(&buffer[0]);
std::wstring wstr(pin, pin + buffer->Length);
handle_ = FindFirstFileW(wstr.c_str(), fd_);
return handle_ != INVALID_HANDLE_VALUE;
}
bool FindNext() {
return FindNextFileW(handle_,fd_) != FALSE;
}
void FindClose() {
::FindClose(handle_);
}
property String^ Name {
String^ get() { return gcnew String(fd_->cFileName); }
}
};
}
C#でこいつをwrapする:
namespace Trial {
public static class EnumFiles {
public static IEnumerable<string> FindAll(string filename) {
FindFile ff = new FindFile();
bool result = ff.FindFirst(filename);
while ( result ) {
yield return ff.Name;
result = ff.FindNext();
}
ff.FindClose();
}
}
}
さてお試し。
class Program {
static void Main() {
foreach ( string filename in Trial.EnumFiles.FindAll("*.*") ) {
Console.WriteLine(filename);
}
}
}
おおぉ、動くやん動くやん♪
今年もなんやかんやと愉しませていただきました。
まぁだまだ若いモンには負けへんでー
ってーわけで、来年も遊んでやっておくれよし。