var fs = require('fs') var path = require('path') var root = "C:\\" var vext = ['mp4', 'avi', 'ts', 'mov', 'wtv'] var skip = ['node_modules', '.git', 'Windows', 'ProgramData'] var system = ['sys', 'ini', 'bat', 'exe', 'dll'] var que = [] // unsorted var sque = [] // Folder dump array, not sorted var csque = [] // plans for using it as a count/awareness for furthers steps const fld = 'fold' const fle = 'file' var foldcnt = 0 var spider = false var spider2 = false var spiderd = false function FilKey(slot) { csque = slot var l = slot.length for (a=0;a { if (err) { if (err.errno === -4048 || err.errno === -4058) { var skp = Direct.split('\\') var skplst = skp.length-1 skip.push(skp[skplst]) return } else { console.error("Could not list the directory.", err) process.exit(1) } } else { files.forEach( (file, index) => { var ffile = path.join(Direct, file) var sys = syschk(ffile, skip, system) if (sys) { } else if (filorfol === fld) { folder(ffile) } else if (filorfol === fle) { filex(ffile) } }) if (filorfol === fle) { let s = csque[0] csque.shift() console.log(s + '<- Shifted off of csque') } else if (filorfol === fld) { spider2 = true } } }) } /* Uses Directory method thinking, to process 'files' and a 2nd augurment to control file or folders Uses read Directory (permission failure) to build inaccessible folder list to skip later Sets spider2 True, as recently accessed folder method*/ function extchk(file, ext) { var sfile = file.split(".") var last = sfile.length-1 var control = 0 for (s=0;s 0) { return true } else { return false } } // Checks for file extensions & returns true if found function syschk(file, skipp, sysext) { var sfile = file.split(".") var last = sfile.length-1 var ffile = file.split("\\") var flast = ffile.length-1 var control = 0 for (s=0;s0) { return true } else { return false } } // Checks for system files & inaccessible folders with arrays, & folders to be excluded with an array function folder(fold) { fs.access(fold, fs.constants.X_OK, (err) => { if (err) { console.log(err.errno) } else { fs.stat(fold, (error, stat) => { if (error) { if (err.errno === -4048 || err.errno === -4058) { var skp = Direct.split('\\') var skplst = skp.length-1 skip.push(skp[skplst]) return } else { console.error("Error stating file.", error) return } } if (stat.isDirectory()) { if (sque.includes(fold)) { console.log('Looping found') process.exit } else { foldcnt = foldcnt+1 sque.push(fold) console.log(fold + '<- Current' +'\n Number of folders -> ' + sque.length) prep(fold, fld) } } }) } }) } // double check access right to 'file' in question, Checks if 'file' is a folder and arrays it if so function filex(fil) { fs.access(fil, fs.constants.X_OK, (err) =>{ if (err) { console.log(err.errno) } else { fs.stat(fil, (error, stat) => { if (error) { console.error("Error stating file.", error) return } if (stat.isFile()) { var etx = extchk(fil, vext) if (etx) { que.push(fil) } } }) } }) } // double check access right to 'file' in question, filters for wanted files via extension w/ true function match(num, array) { var num2 = array.length if (num === num2) { return true } else { return false } } // Check to see if the count matches array length, returns true if so let spi1 = setInterval(() => { if (sque.length>1 && !spider && !spider2) { spider = match(foldcnt, sque) } }, 3000) /* checks every 3 seconds if preset array length is 1+ long & if both Spiders control are false sets spider true if Match is true To reuse, will need to a prime function for folder starting */ let spi2 = setInterval(() => { spider2 = false if (spider) { FilKey(sque) spiderd = true } }, 5000) /* checks every 5 seconds, sets 2nd spider false, checks if spider is true enables spider death */ let spidie = setInterval(() => { if (spiderd) { clearInterval(spi1) clearInterval(spi2) clearInterval(spidie) console.log('Stopped Spiders') } }, 1000) // disables/kills spiders DirKey(root) /* Current starting point, Likely repacable with function that can work multiple orgin points for file scrubbing Will be segmented to allow for more advanced feature sets/controling. */ // Control Files to come, atm use of either a file or user input to build the control files. // WIP *DePhoegon