Get a list of all loaded waves

Hi all!

I have been searching for a way to get a list of all loaded waves in an igor experiment for a few weeks now. I have tried WaveList("*",";","") but that gets all the waves in the folder even if they aren't already loaded. I have also looked at the waveselectorwidget example but I am still not able to get it.

Thanks for the help.
Ryleigh
that gets all the waves in the folder even if they aren't already loaded

When you open an Igor experiment file, all waves in the experiment are loaded into memory. So "even if they aren't already loaded" does not make sense.

WaveList("*",";","") gives you a list of all waves in the current data folder. Note that a "data folder" is not the same as a folder on disk.

To learn about data folders, execute:
DisplayHelpTopic "Data Folders"

I have made some utilities to make lists of Igor data, from a single data folder or from the data folder plus all subfolders. I need to make an official release of the utilities package. In the meantime....


// Static constants used for options variable for functions
STATIC CONSTANT kRECURSE =1
STATIC CONSTANT kGETPATH = 2
STATIC CONSTANT kADDCOLON = 4
STATIC CONSTANT kNOPACKAGES = 8
//Procedures for making lists of Igor objects from folders and graphs, with specializations for making the kinds of lists used in popup menus
//******************************************************************************************************
//  GUIPListObjs returns a semicolon-separated list of all the objects of the slelected type (objectType)
// in the given folder (sourceFoldrStr)whose names match the given string (matchStr)
// Last Modified 2014/12/04 by Jamie Boyd
Function/s GUIPListObjs (sourceFolderStr, objectType, matchStr, options, erstring, [sepStr])
	string sourceFolderStr	// can be either ":" or "" to specify the current data folder. You can also use a full or partial data folder path.
	variable objectType		// 1 = waves, 2= numeric variables, 3= string variables, 4 = data folders
	string matchstr			// limit list of objects with this wildcard-enhanced string. use "*"  to get all objects	
	variable options			// bit 0=1: set to do a recursive call through all subfolders of the source folder
							// bit 1 =2:  set to get full or relative filepaths depending on sourceFolderStr. unset to get just the objects with no path.
							// bit 2 =4: If listing folders, set to suffix folder names with a colon, good for building filepaths, unset for no colon
							// bit 3 = 8: do not list packages folder or items from packages folder
	string erstring			// a string to return if no objects are found
	string sepStr			// optional separator string for returned list. Default is ";"
	
	if (ParamIsDefault(sepStr))
		sepStr = ";"
	endif
	// return error message if folder does not exist
	// why the "\\M1(" ? It is a formatting code for disabling choices in pop-up menus
	if (!(datafolderexists (sourceFolderStr)))
		return "\\M1(" + sourceFolderStr + " does not exist." 
	endif
	// make sure sourceFolderStr ends with a colon
	sourceFolderStr = RemoveEnding (sourceFolderStr, ":") + ":"
	// if giving path, or when doing recursive calls, prepend each object name with sourceFolder
	string endStr = sepStr, prependStr = SelectString ((options & (kGETPATH + kRECURSE)), "", sourceFolderStr)
	DFREF sourceDFR = $sourceFolderStr
	// if listing folders, end each folder name with a colon if requested, and always add a list separator
	if (objectType ==4)
		endStr = SelectString ((options & kADDCOLON), sepStr, ":" + sepStr)
	endif
	// start return list with matching objects in sourceFolder
	variable iObj
	string objName, returnList = ""
	// if not listing packages folder, check for it when we are looking through root folder
	if (((options & kNOPACKAGES) && (cmpStr (sourceFolderStr, "root:") ==0)) && (objectType ==4))
		for (iObj = 0 ; ; iObj += 1)
			objName = GetIndexedObjNameDFR(sourceDFR, objectType, iObj)
			if (strlen (objName) > 0)
				if ((stringmatch(objname, matchStr )) && (stringMatch (objname, "!packages")))
					returnList += prependStr  + possiblyquoteName (objname) + endStr
				endif
			else
				break
			endif
		endfor
	else
		for (iObj = 0 ; ; iObj += 1)
			objName = GetIndexedObjNameDFR(sourceDFR, objectType, iObj)
			if (strlen (objName) > 0)
				if (stringmatch(objname, matchStr ))
					returnList += prependStr  + possiblyquoteName (objname) + endStr
				endif
			else
				break
			endif
		endfor
	endif
	// If recursive, iterate though all folders in sourceFolder
	// in recursive calls, set erString to "", so user's erStr is not added to the return list for every empty subfolder, only if all folders are empty
	if (options & kRECURSE)
		variable iFolder
		string aFolder
		if ((options & kNOPACKAGES) && (cmpStr (sourceFolderStr, "root:") ==0)) 
			for (iFolder =0; ; iFolder +=1)
				aFolder =  GetIndexedObjNameDFR(sourceDFR, 4,  iFolder)
				if (strlen (aFolder) > 0)
					if (StringMatch (aFolder, "!packages")) // if not listing packages folder, check for it when we are looking through root folder
						returnList += GUIPListObjs (sourceFolderStr + possiblyquotename (aFolder), objectType, matchStr, options , "", sepStr = sepStr)
					endif
				else
					break
				endif
			endfor
		else
			for (iFolder =0; ; iFolder +=1)
				aFolder = GetIndexedObjNameDFR(sourceDFR, 4,  iFolder)
				if (strlen (aFolder) > 0)
					returnList += GUIPListObjs (sourceFolderStr + possiblyquotename (aFolder), objectType, matchStr, options , "", sepStr = sepStr)
				else
					break
				endif
			endfor
		endif
	endif
	//  if no list was made, and this is the starting call, return user's error message
	if (strlen (returnList) < 2)
		return erstring
	else
		return returnList
	endif
end


To see a list of all the waves in the experiment:
print GUIPListObjs ("root:", 1, "*", 1, "")

If you are looking for a list of files in a directory on disk, well I have a function to do that as well, from the same package. It has many options, and you have to make an Igor path.

//******************************************************************************************************
//Returns a list of files of a particular type, whose names match the match string, and are located in the disk directory pointed to by the given path 
// Last modified: 2014/12/04 by Jamie Boyd
// Added option to follow items that are shortcuts
// Mod 2014/10/22 by Jamie Boyd: Includes option to also list creation date and modification date
Function/S GUIPListFiles (ImportpathStr,  fileTypeOrExtStr, matchStr, options, erstring, [sepStr])
	String ImportPathStr	// Name of an Igor Path
	String fileTypeOrExtStr	// macintosh file type (4 characters) or Windows extension, e.g.,  ".txt", or "dirs" to list directories
	String MatchStr  		// string to match file names for listing. Wildcard enabled. Pass "*" to list all files
	variable options			// bit 0=1: set to do a recursive call through all directories of the source directory
							// bit 1 =2: set to get full file paths. unset to get just the object names with no path.
							// bit 2 =4: set to strip three character file name extensions from returned file names
							// bit 3 = 8: set to allow user to set ImportPath if it does not already exist.
							// bit 4 = 16: set to list file creation dates after each file name
							// bit 5 = 32: set to list file modification dates after each file name, or after each creation date
							// bit 6 = 64: set to list alias/shortcuts that point to files, and to list contents of aliases to folders-must be listing full paths
	string erstring			// a string to return if no objects are found
	string sepStr			// optional separator string for returned list. Default is ";"
	
	if (ParamIsDefault(sepStr))
		sepStr = ";"
	endif
	// we  have to look for shorcuts/aliases differently on Mac vs PC 
	string fileAliasExt = ".lnk", fldrAliasExt = ".lnk"
	if (cmpStr ( IgorInfo (2), "Macintosh") ==0)
		fileAliasExt = "alis"
		fldrAliasExt ="fdrp"
	endif
	// if the Igor path does not exist, let the user set it, if that option is chosen
	string sourceDirStr
	PathInfo  $ImportPathStr
	if (!(V_Flag))
		if (options & 8)
			NewPath /O/M= "Set Path to FIles of type " + fileTypeOrExtStr $ImportPathStr
			if (V_flag)
				return "\\M1(Invalid Path"
			else
				PathInfo  $ImportPathStr
				sourceDirStr = S_path
			endif
		else
			return "\\M1(Invalid Path"
		endif
	else
		sourceDirStr = S_path
	endif
	// if giving path, prepend each object name with sourceFolder
	string prependStr = SelectString ((options & kGETPATH), "", sourceDirStr)
	// string prependStr = SelectString (((options & kGETPATH) ||  (options & 64)), "", sourceDirStr)
	// iterate through files in this directory
	string afileName, allFiles, returnList = "" // lists of files that we will return
	variable iFile, nFiles, nameLen, aliasPathDepth
	if (cmpStr (fileTypeOrExtStr, "dirs") ==0) // looking for directories
		AllFiles = IndexedDir($ImportpathStr, -1, (options & 4))
		nFiles = itemsinlist (AllFiles, ";")
		Make/N=(nFiles)/T/FREE tempFiles = StringFromList(p, AllFiles)
		for (iFile =0; iFile < nFiles; iFile +=1)
			afileName =tempFiles [iFile]
			if (stringmatch(afileName, matchStr))
				returnList += prependStr + aFileName + sepStr
				if (options & 48)
					GetFileFolderInfo /P=$ImportpathStr/Q afileName
					if (options & 16)
						returnList += secs2Date (V_creationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) + sepStr
					endif
					if (options & 32)
						returnList += secs2Date (V_modificationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) +  sepStr
					endif
				endif
			endif
		endfor
		if (options & 64)
			// now look for aliases to folders, probably fewer of these, so not bothering making a temp wave
			AllFiles =  IndexedFile ($ImportPathStr, -1, fldrAliasExt)
			for (iFile =0, nFiles = itemsinlist (AllFiles, ";"); iFile < nFiles; iFile +=1)
				afileName = StringFromList (iFile, allFiles, ";")
				GetFileFolderInfo /P=$ImportpathStr /Q aFilename
				if ((V_isAliasShortcut) && (cmpStr (S_aliasPath [Strlen (s_aliasPath) -1], ":") ==0))
					aliasPathDepth = itemsinlist (s_aliasPath, ":") -1
					afileName = StringFromList(aliasPathDepth, S_aliasPath, ":" )
					if (stringmatch(afileName, matchStr))
						returnList +=S_aliasPath + sepStr
						if (options & 48)
							GetFileFolderInfo S_aliasPath
							if (options & 16)
								returnList += secs2Date (V_creationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) + sepStr
							endif
							if (options & 32)
								returnList += secs2Date (V_modificationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) +  sepStr
							endif
						endif
					endif
				endif
			endfor
		endif
	else  //looking for files
		AllFIles = IndexedFile ($ImportPathStr, -1, fileTypeOrExtStr)
		nFiles = itemsinlist (AllFiles, ";")
		Make/O/N=(nFiles)/T/FREE tempFiles = StringFromList(p, AllFiles)
		for (iFile =0; iFile < nFiles; iFile +=1)
			afileName =tempFiles [iFile]
			if (stringmatch(afileName, matchStr))
				if (options & 4)
					NameLen = strlen (afileName)
					if ((cmpstr (afileName [NameLen - 4], ".")) == 0)
						returnList += prependStr + aFileName [0, NameLen - 5] +  sepStr
					else
						returnList += prependStr  + aFileName + sepStr
					endif
				else
					returnList += prependStr  + aFileName + sepStr
				endif
				if (options & 48)
					GetFileFolderInfo /P=$ImportpathStr/Q afileName
					if (options & 16)
						returnList += secs2Date (V_creationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) +  sepStr
					endif
					if (options & 32)
						returnList += secs2Date (V_modificationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) +  sepStr
					endif
				endif
			endif
		endfor
		if (options & 64)
			// now look for aliases to files, probably fewer of these, so not bothering making a temp wave
			AllFiles =  IndexedFile ($ImportPathStr, -1, fileAliasExt)
			for (iFile =0, nFiles = itemsinlist (AllFiles, ";"); iFile < nFiles; iFile +=1)
				afileName = StringFromList (iFile, allFiles, ";")
				GetFileFolderInfo /P=$ImportpathStr /Q aFilename
				if ((V_isAliasShortcut) && (cmpStr (S_aliasPath [Strlen (s_aliasPath) -1], ":") !=0))
					aliasPathDepth = itemsinlist (s_aliasPath, ":") -1
					afileName = StringFromList(aliasPathDepth, S_aliasPath, ":" )
					if (stringmatch(afileName, matchStr))
						returnList +=S_aliasPath + sepStr
						if (options & 48)
							GetFileFolderInfo S_aliasPath
							if (options & 16)
								returnList += secs2Date (V_creationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) + sepStr
							endif
							if (options & 32)
								returnList += secs2Date (V_modificationDate, -2, "/") + "/" + Secs2Time(V_creationDate, 2) +  sepStr
							endif
						endif
					endif
				endif
			endfor
		endif
	endif
	// If recursive, iterate though all folders in sourceFolder
	// in recursive calls, set erString to "", so user's erStr is not added to the return list for every empty subfolder, only if all folders are empty
	if (options & kRECURSE)
		string subFolders
		variable iFolder, nFolders
		if ((options & kGETPATH) ||  (options & 64)) // if getting full path, just list the files
			subFolders = IndexedDir($ImportpathStr, -1, 1)
			nFolders = itemsinList (subFolders, ";")
			for (iFolder =0; iFolder < nFolders; iFolder +=1)
				NewPath /O/Q GuipListRecPath, stringFromList (iFolder, subFolders, ";")
				returnList += GUIPListFiles ("GuipListRecPath",  fileTypeOrExtStr, matchStr, options, "", sepStr = sepStr)
			endfor
			if (options & 64)
				AllFiles =  IndexedFile ($ImportPathStr, -1, fldrAliasExt)
				for (iFile =0, nFiles = itemsinlist (AllFiles, ";"); iFile < nFiles; iFile +=1)
					afileName = StringFromList (iFile, allFiles, ";")
					GetFileFolderInfo /P=$ImportpathStr /Q aFilename
					if ((V_isAliasShortcut) && (cmpStr (S_aliasPath [Strlen (s_aliasPath) -1], ":") ==0))
						NewPath /O/Q GuipListRecPath, S_aliasPath
						returnList += GUIPListFiles ("GuipListRecPath",  fileTypeOrExtStr, matchStr, options, "", sepStr = sepStr)
					endif
				endfor
			endif
		else	 // if not getting full path, need to make relative path from starting folder
			string dirStr = stringFromList (itemsinList (sourceDirStr, ":")-1, sourceDirStr, ":") + ":"
			string subList
			string subDirStr
			subFolders = IndexedDir($ImportpathStr, -1, 0)
			nFolders = itemsinList (subFolders, ";")
			for (iFolder =0; iFolder < nFolders; iFolder +=1)
				subDirStr = stringFromList (iFolder, subFolders, ";")
				NewPath /O/Q GuipListRecPath, sourceDirStr + subDirStr
				subList = GUIPListFiles ("GuipListRecPath",  fileTypeOrExtStr, matchStr, options, "", sepStr = sepStr)
				for (iFile=0, nFiles = itemsinList (subList, sepStr); iFile < nFiles; iFile +=1)
					returnList += subDirStr + ":" + stringFromList (iFile, subList, sepStr) + sepStr
					if ((options & 16) || (options & 32))
						iFIle +=1
						returnList += stringFromList (iFile, subList, sepStr) + sepStr
					endif
					if ((options & 16) && (options & 32))
						iFIle +=1
						returnList += stringFromList (iFile, subList, sepStr) + sepStr
					endif
				endfor

			endfor
		endif
	endif
	//  if no list was made, and this is the starting call, return user's error message
	if (strlen (returnList) < 2)
		return erString
	else
		return returnList
	endif
end


For example, the following command:
print GUIPListFiles ("MyPath", "????", "*", 8, "")
will make a new Igor Path named MyPath and the user will have an opportunity to choose the folder the path points to. It will return a list of files of all file types.

cheers,

Dr. Jamie Boyd, Ph.D.