読者です 読者をやめる 読者になる 読者になる

ツタンラーメンの忘備録

プログラミングや精神疾患、ラーメンについて書いていきます。たぶん。

openframeworksでカレントディレクトリを取得しようとしたけど失敗した話

タイトルの通り(ちなみに最初、コードを記載する部分に>|c++|とかわけわからないこと書いて色分けされず焦った)

結論から言うと私の場合はofDirectoryとofFileを組み合わせれば実装できた。
今回の流れは

  1. なぜ取得しようと思ったか
  2. カレントディレクトリが取得できない
  3. ファイル数も取れない
  4. ofDirectoryを発見
  5. サンプルコード

の順である。


1. 目的
プレゼン資料をパワーポイントで作って、全スライド画像出力→openframeworksで実行すればoFで疑似スライドショーができるんじゃないか!?しかもインタクティブな要素加え放題じゃん!(画像化しているのでベースは動かせないのだけど…。)
正直全スライドをclass化して、文字表示すればいい気もするのだが…


2. カレントディレクト
こちらのサイトを見て(間違った内容が一点混じっているにも関わらず検索上位に出てくるからすごい)
C++のTips - カレントディレクトリを取得するには?:tech.ckme.co.jp

#include <Windows.h>
//略
char cdir[255];
GetCurrentDirectory(255,cdir);
cout<<"Current Directory : "<<cdir<<endl;

とまあ、いろいろ書いたけれどGetCurrentDirectoryは定義されていないと出る。
なにをやろうとしていたかというと単純にopenframeworksのbin/data内のpngファイル数を知りたかった。


3. ファイル数取得(カレントディレクトリを取得できない時点でモチベーションを失ったので、特に見つけただけで何もしていない)
下と上を組み合わせれば、できるんじゃない?と思ったけど
Win32API ディレクトリを走査しファイルを検索する FindFirstFile FindNextFile FindClose - s-kitaの日記

#include <windows.h>

int main()
{
	HANDLE hFind;
	WIN32_FIND_DATA win32fd;

	hFind = FindFirstFile("C:\\*.*", &win32fd);

	if (hFind == INVALID_HANDLE_VALUE) {
		return 1;
	}

	do {
		if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
			printf("%s (DIR)\n", win32fd.cFileName);
		} else {
			printf("%s\n", win32fd.cFileName);
		}
	} while (FindNextFile(hFind, &win32fd));

	FindClose(hFind);
	
	return 0;
}

下は下でエラー出るし、そもそもopenframeworksに実装されてるんじゃね?と思ったら案の定ありました。

4. oFにはofDirectoryというものがありました。
http://openframeworks.cc/documentation/utils/ofDirectory/openframeworks.cc
shingo sasahara — openFrameworks ファイル操作

上2つで大丈夫だと思うけど一応最後に私が何したかも記しておく。


5. 私が書いたコード(必要なところだけ)
そもそも画像を配列で持たないといけないので、画像配列を作ります。(画像とかいう重いものをvectorにしていいのだろうか…)
ofApp.h内

vector<ofImage> imgs;

ofApp.cpp内

void ofApp::setup(){
	string folderName = "Test/"; //ここが空白(""だとdataを参照できるそうです。)
	ofDirectory dir(folderName);
	dir.allowExt("png");
	dir.listDir();
	int lastSlideNumber = dir.numFiles();
	for (int i = 1; i <= lastSlideNumber; i++) {
		string imgPath = folderName + "スライド" + ofToString(i) + ".PNG";
		ofImage tmpImg;
		tmpImg.loadImage(imgPath);
		imgs.push_back(tmpImg);
	}
}

ちなみにpptxから「名前をつけて保存」で「.png」を選んだ場合に入力する名前は
単一スライドだと「入力名.png」になるんだけど複数スライドだと「入力名」フォルダができてその下に「スライド1」「スライド2」…が入る形になっている。
なんかちょっとややこしいし、個々の「スライド」ってところもまとめて編集できたらいいのにね。



あと一瞬詰まったのが、

ofImage tmpImg;
tmpImg.loadImage(imgPath);
imgs.push_back(tmpImg);

の部分。

imgs.push_back(imgs[0].loadImage(imgPath));

は許されなかった。そりゃそうだよね。