List files in Igor special folders following aliases (links) and directories
ilavsky
Mon, 03/16/2009 - 11:52 am
The code can be easily modified to provide different output or look into different folders.
Example at the top are two functions - one to get User Procedures and one to get Igor Procedures content. Both call static function, which is heavily commented.
Function ListUserProcFiles()
GetFileFolderInfo/Q/P=Igor "User Procedures"
ListProcFiles(S_Path)
end
Function ListIgorProcFiles()
GetFileFolderInfo/Q/P=Igor "Igor Procedures"
ListProcFiles(S_Path)
end
static Function ListProcFiles(PathStr)
string PathStr
string OldDf=GetDataFolder(1)
//create location for the results waves...
NewDataFolder/O/S root:Packages
NewDataFolder/O/S root:Packages:UseProcedureFiles
//if this is top call to the routine we need to wipe out the waves so we remove old junk
string CurFncName=GetRTStackInfo(1)
string CallingFncName=GetRTStackInfo(2)
variable runningTopLevel=0
if(!stringmatch(CurFncName,CallingFncName))
KillWaves/Z FileNames, PathToFiles, FIleVersions
runningTopLevel=1
//catch if the waves were not killed sice they were in use...
Wave/Z/T FileNames
if(WaveExists(FileNames))
setDataFolder OldDf
Abort "Output waves could not be killed, they are probably part of table. Please, close all output waves tables or graphs."
endif
endif
//if this was first call, now the waves are gone.
//and now we need to create the output waves
Wave/Z/T FileNames
Wave/Z/T PathToFiles
Wave/Z FIleVersions
If(!WaveExists(FileNames) || !WaveExists(PathToFiles))
Make/O/T/N=0 FileNames, PathToFIles
Make/O/N=0 FileVersions
Wave/T FileNames
Wave/T PathToFiles
Wave FileVersions
//I am not sure if we really need all of those declarations, but, well, it should not hurt...
endif
//this is temporary path to the place we are looking into now...
NewPath/Q/O tempPath, PathStr
//list al items in this path
string ItemsInTheFolder= IndexedFile(tempPath,-1,"????")+IndexedDir(tempPath, -1, 0 )
//remove all . files.
ItemsInTheFolder = GrepList(ItemsInTheFolder, "^\." ,1)
//Now we removed all junk files on Macs (starting with .)
//now lets check what each of these files are and add to the right lists or follow...
variable i, imax=ItemsInList(ItemsInTheFolder)
string tempFileName, tempScraptext
For(i=0;i<imax;i+=1)
tempFileName = stringfromlist(i,ItemsInTheFolder)
GetFileFolderInfo/Q/P=tempPath tempFileName
if(V_isAliasShortcut)
//is alias, need to follow and look further. Use recursion...
ListProcFiles(S_aliasPath)
//and now when we got back, fix the path definition to previous or all will crash...
NewPath/Q/O tempPath, PathStr
elseif(V_isFolder)
//is folder, need to follow into it. Use recursion.
ListProcFiles(PathStr+tempFileName+":")
//and fix the path back or all will fail...
NewPath/Q/O tempPath, PathStr
elseif(V_isFile)
//this is real file. Store information as needed.
Redimension/N=(numpnts(FileNames)+1) FileNames, PathToFiles,FileVersions
FileNames[numpnts(FileNames)] = tempFileName
PathToFiles[numpnts(FileNames)] = PathStr
//try to get version from #pragma version = ... This seems to be the most robust way I found...
if(stringmatch(tempFileName, "*.ipf"))
Grep/P=tempPath/E="(?i)^#pragma[ ]*version[ ]*=[ ]*" tempFileName as "Clipboard"
tempScraptext = GetScrapText()
if(strlen(tempScraptext)>10) //found line with #pragma version"
tempScraptext = replaceString("#pragma",tempScraptext,"") //remove #pragma
tempScraptext = replaceString("version",tempScraptext,"") //remove version
tempScraptext = replaceString("=",tempScraptext,"") //remove =
tempScraptext = replaceString("\t",tempScraptext," ") //remove optional tabulators, some actually use them.
//forget about the comments behind the text.
//str2num is actually quite clever in this and converts start of the string which makes sense.
FileVersions[numpnts(FileNames)]=str2num(tempScraptext)
else //no version found, set to NaN
FileVersions[numpnts(FileNames)]=NaN
endif
else //no version for non-ipf files
FileVersions[numpnts(FileNames)]=NaN
endif
endif
endfor
if(runningTopLevel)
//some output here...
print "Found "+num2str(numpnts(FileNames))+" files in "+PathStr+" folder, its subfolders and linked folders and subfolders"
KillPath/Z tempPath
endif
setDataFolder OldDf
end
GetFileFolderInfo/Q/P=Igor "User Procedures"
ListProcFiles(S_Path)
end
Function ListIgorProcFiles()
GetFileFolderInfo/Q/P=Igor "Igor Procedures"
ListProcFiles(S_Path)
end
static Function ListProcFiles(PathStr)
string PathStr
string OldDf=GetDataFolder(1)
//create location for the results waves...
NewDataFolder/O/S root:Packages
NewDataFolder/O/S root:Packages:UseProcedureFiles
//if this is top call to the routine we need to wipe out the waves so we remove old junk
string CurFncName=GetRTStackInfo(1)
string CallingFncName=GetRTStackInfo(2)
variable runningTopLevel=0
if(!stringmatch(CurFncName,CallingFncName))
KillWaves/Z FileNames, PathToFiles, FIleVersions
runningTopLevel=1
//catch if the waves were not killed sice they were in use...
Wave/Z/T FileNames
if(WaveExists(FileNames))
setDataFolder OldDf
Abort "Output waves could not be killed, they are probably part of table. Please, close all output waves tables or graphs."
endif
endif
//if this was first call, now the waves are gone.
//and now we need to create the output waves
Wave/Z/T FileNames
Wave/Z/T PathToFiles
Wave/Z FIleVersions
If(!WaveExists(FileNames) || !WaveExists(PathToFiles))
Make/O/T/N=0 FileNames, PathToFIles
Make/O/N=0 FileVersions
Wave/T FileNames
Wave/T PathToFiles
Wave FileVersions
//I am not sure if we really need all of those declarations, but, well, it should not hurt...
endif
//this is temporary path to the place we are looking into now...
NewPath/Q/O tempPath, PathStr
//list al items in this path
string ItemsInTheFolder= IndexedFile(tempPath,-1,"????")+IndexedDir(tempPath, -1, 0 )
//remove all . files.
ItemsInTheFolder = GrepList(ItemsInTheFolder, "^\." ,1)
//Now we removed all junk files on Macs (starting with .)
//now lets check what each of these files are and add to the right lists or follow...
variable i, imax=ItemsInList(ItemsInTheFolder)
string tempFileName, tempScraptext
For(i=0;i<imax;i+=1)
tempFileName = stringfromlist(i,ItemsInTheFolder)
GetFileFolderInfo/Q/P=tempPath tempFileName
if(V_isAliasShortcut)
//is alias, need to follow and look further. Use recursion...
ListProcFiles(S_aliasPath)
//and now when we got back, fix the path definition to previous or all will crash...
NewPath/Q/O tempPath, PathStr
elseif(V_isFolder)
//is folder, need to follow into it. Use recursion.
ListProcFiles(PathStr+tempFileName+":")
//and fix the path back or all will fail...
NewPath/Q/O tempPath, PathStr
elseif(V_isFile)
//this is real file. Store information as needed.
Redimension/N=(numpnts(FileNames)+1) FileNames, PathToFiles,FileVersions
FileNames[numpnts(FileNames)] = tempFileName
PathToFiles[numpnts(FileNames)] = PathStr
//try to get version from #pragma version = ... This seems to be the most robust way I found...
if(stringmatch(tempFileName, "*.ipf"))
Grep/P=tempPath/E="(?i)^#pragma[ ]*version[ ]*=[ ]*" tempFileName as "Clipboard"
tempScraptext = GetScrapText()
if(strlen(tempScraptext)>10) //found line with #pragma version"
tempScraptext = replaceString("#pragma",tempScraptext,"") //remove #pragma
tempScraptext = replaceString("version",tempScraptext,"") //remove version
tempScraptext = replaceString("=",tempScraptext,"") //remove =
tempScraptext = replaceString("\t",tempScraptext," ") //remove optional tabulators, some actually use them.
//forget about the comments behind the text.
//str2num is actually quite clever in this and converts start of the string which makes sense.
FileVersions[numpnts(FileNames)]=str2num(tempScraptext)
else //no version found, set to NaN
FileVersions[numpnts(FileNames)]=NaN
endif
else //no version for non-ipf files
FileVersions[numpnts(FileNames)]=NaN
endif
endif
endfor
if(runningTopLevel)
//some output here...
print "Found "+num2str(numpnts(FileNames))+" files in "+PathStr+" folder, its subfolders and linked folders and subfolders"
KillPath/Z tempPath
endif
setDataFolder OldDf
end
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More