멋지다 가리

nicegary.egloos.com

포토로그




ms 에서 .NET FileSystemWatcher 사용. MAXScript

맥스스크립트에서 닷넷의 FileSystemWatcher 클래스를 사용하여 파일 또는 디렉토리의 변화를 실시간으로 감지하는 방법.
-------------------------------------------------------------------------------------------------------------
-- Title: Watcher Test
-- Author : Jaemin Park
-- email : nicegary815@gmail.com
-- Description : 닷넷 FileSystemWatcher 클래스를 사용하여 파일 또는 디렉토리의 변화를 감지하는 스크립트 테스트.
-- 3DS Max 2010, 2012 에서 작성, 테스트.
-- http://cafe.daum.net/maxscript 에서 질문을 보고 
-- http://forums.cgsociety.org/showthread.php?t=850433 에서 정보를 얻음.
-------------------------------------------------------------------------------------------------------------
(
Global WatcherTest
try( destroyDialog WatcherTest ) catch()
local filelist = #()
local detectpath = ""
rollout WatcherTest "닷넷 와쳐 테스트"
(
button btn_path "폴더 선택" width:75 height:20 across:2 align:#left 
button btn_callback "콜백 설치" width:100 height:20
multilistbox mlb_filelist height:10
--multilistbox를 업데이트
fn UpdateMLB =
(
-----------------------------------------------------
--filelist 를  업데이트하는 루틴. 테스트를 위해 이곳에 둠.
filelist = getFiles ( detectpath + "\\*.ms" )
join filelist ( getFiles ( detectpath + "\\*.mcr" ))
sort filelist
-----------------------------------------------------
local filenamelist = #()
for f in filelist do
(
append filenamelist ( filenameFromPath f )
)
mlb_filelist.items = filenamelist
)
--파일 또는 디렉토리의 내용변경(Changed) 때 발생.
fn OnChanged sender args =
(
print ("OnChanged FullPath: " + args.FullPath)
UpdateMLB()
)
--파일 또는 디렉토리의 생성(Created) 때 발생.
fn OnCreated sender args =
(
print ("OnCreated FullPath: " + args.FullPath)
UpdateMLB()
)
--파일 또는 디렉토리의 삭제(Deleted) 때 발생.
fn OnDeleted sender args =
(
print ("OnDeleted FullPath: " + args.FullPath)
UpdateMLB()
)
--파일 또는 디렉토리의 이름이 바뀔(Renamed) 때 발생.
fn OnRenamed sender args =
(
print ("OnRenamed FullPath: " + args.FullPath)
print ("OnRenamed OldPath: " + args.OldFullPath)
UpdateMLB()
)
on WatcherTest open do
(
)
on btn_path pressed do
(
detectpath = getSavePath caption:"디렉토리 선택." initialDir: "d:\\"
if detectpath==undefined or detectpath=="" then 
return undefined
else
UpdateMLB()
)
on btn_callback pressed do
(
if detectpath == "" or detectpath == undefined then
messagebox "설정된 폴더가 없습니다."
else
(
--닷넷3.5 http://msdn.microsoft.com/ko-kr/library/system.io.filesystemwatcher(v=vs.90).aspx 
--닷넷4.5 http://msdn.microsoft.com/ko-kr/library/x7t1d0ky.aspx 
watcher = dotNetObject "System.IO.FileSystemWatcher"
watcher.Path = detectpath
--NotifyFilter 기본값이 LastWrite, FileName, DirectoryName 이다.
--2개 이상의 필터를 적용하기 위해서는 dotNet.combineEnums 를 사용해야 한다.
/-watcher.NotifyFilter = dotNet.combineEnums (dotnetclass "System.IO.Notifyfilters").LastAccess\
(dotnetclass "System.IO.Notifyfilters").LastWrite\
(dotnetclass "System.IO.Notifyfilters").FileName\
(dotnetclass "System.IO.Notifyfilters").DirectoryName
*-
--Filter 여러 필터는 지원하지 않음. 이벤트핸들러가 작동한 후에 메소드를 통해 필터 변경 가능.
watcher.Filter = "*.*" -- "*.max"
watcher.EnableRaisingEvents = true
--watcher.IncludeSubdirectories = true --하위 디렉토리 포함 여부.
--이벤트 콜백 설치.
--Changed, Created, Deleted 는 이벤트 함수가 받는 인자가 같으므로 하나의 함수로 사용 가능.
dotnet.addeventhandler watcher "Changed" OnChanged
dotnet.addeventhandler watcher "Created" OnCreated
dotnet.addeventhandler watcher "Deleted" OnDeleted
dotnet.addeventhandler watcher "Renamed" OnRenamed
)
)
-- 마우스 오른 버튼을 누르면 선택 취소.
on mlb_filelist rightClick do
(
mlb_filelist.selection = #{}
)
on mlb_filelist selected index do
(
bitArray = mlb_filelist.selection  
selectfilenumber = 0
for i = 1 to bitArray.count do
(
if bitArray[i] == true do selectfilenumber += 1
)
)
)
createDialog WatcherTest width:250 height:190 style:#(#style_toolwindow, #style_sysmenu)
)