рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡: рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦреЗрдВ

рдЬрдм рдЖрдк рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдЖрдк рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрд╡реАрдПрдо, рд░реВрдмреА рдпрд╛ рдкрд╛рдпрдерди рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рднреА рд▓реЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдФрд░ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдордд рдХрд░реЛред

рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдЬрдм рднреА рдореБрдЭреЗ рдРрд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реБрдИ, рдореИрдВрдиреЗ рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЧреЛ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдПрдХ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдорд┐рд▓рддреА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдФрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?

рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдХреЛрдЯрд▓рд┐рди рдиреЗ рднреА рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЖрдЬрдорд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ - рдЬреАрд╕реА, рдПрдХ рдПрдХрд▓ рдмрд╛рдЗрдирд░реА, рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ?

рд╣рдореЗрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреА рд╣реИ: рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рд╛рдЗрд▓ рд╡реЙрдЪрд░ рд▓рд┐рдЦреЗрдВред рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдкрде рдФрд░ рд╕реНрдХреИрди рдХреА рдЖрд╡реГрддреНрддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдмрджрд▓ рдЧрдИ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдирдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрд╕рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдиреА рд╣реЛрдЧреАред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

fileToWatch = getFileToWatch() howOftenToCheck = getHowOftenToCheck() while (!stopped) { if (hasChanged(fileToWatch)) { copyAside(fileToWatch) } sleep(howOftenToCheck) } 

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╕реБрд▓рдЭрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рдПред рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордпред

рдмреБрдзрд╡рд╛рд░


рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдПрдХ рдЖрдИрдбреАрдИ рд╣реИред рд╡рд┐рдо рдкреНрд░реЗрдореА рдХреГрдкрдпрд╛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред

рд╣рдо рдкрд░рд┐рдЪрд┐рдд рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдИрдбреАрдИрдП рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдореЗрдВ рдпрд╣ рд╢рдмреНрдж рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ CLion рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

2004 рдореЗрдВ C рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрд▓рддрдлрд╣рдореА рдЕрднреА рдЦрддреНрдо рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдПрдХ рдЙрдкрдХрд░рдг рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрджрд┐ рдЖрдк OSX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ CLION рдЦреБрдж рдХреЛ рдЙрдкрдпреБрдХреНрдд рдЯреВрд▓рдХрд┐рди рдорд┐рд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╕реА рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд╛рдЗрдЧрд╡рд┐рди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдИрдбреАрдИ рд╕реНрдерд╛рдкрд┐рдд, рдЯреВрд▓рдЪрд┐рди рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рдХреНрдпрд╛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рд▓рдЧрднрдЧред
рдЪреВрдБрдХрд┐ Kotlin Native рдЕрднреА рднреА рдХреБрдЫ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИ, рдЗрд╕рд▓рд┐рдП CLion рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИред рддреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдкреЛрд╖рд┐рдд рд╢рд┐рд▓рд╛рд▓реЗрдЦ рджреЗрдЦреЗрдВ "рдиреНрдпреВ рдХреЛрдЯрд▓рд┐рди / рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрдВрдд рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЦрд╛рд▓реА рдХреЛрдЯрд▓рд┐рди рдореВрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдпрд╣ рдЧреНрд░реИрдбрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ (рдФрд░ рдореЗрдХрдлрд╛рдЗрд▓реНрд╕ рдкрд░ рдирд╣реАрдВ), рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЛрдЯрд▓рд┐рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рднреАред

build.gradle.kts . build.gradle.kts рдкрд░ build.gradle.kts рдирдЬрд╝рд░ build.gradle.kts :

 plugins { id("org.jetbrains.kotlin.konan") version("0.8.2") } konanArtifacts { program("file_watcher") } 

рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рдкреНрд▓рдЧрдЗрди рдХреЛрдирд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рд╣рдорд╛рд░реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред

konanArtifacts рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдореЗрдВ file_watcher.kexe рдорд┐рд▓рддрд╛ рд╣реИ

рдХреЛрдб


рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рд╡реИрд╕реЗ:

 fun main(args: Array<String>) { if (args.size != 2) { return println("Usage: file_watcher.kexe <path> <interval>") } val file = File(args[0]) val interval = args[1].toIntOrNull() ?: 0 require(file.exists()) { "No such file: $file" } require(interval > 0) { "Interval must be positive" } while (true) { // We should do something here } } 

рдЖрдорддреМрд░ рдкрд░, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдФрд░ рдЙрдирдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рднреА рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рд╣рдореЗрд╢рд╛ рджреЛ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ: path рдФрд░ interval

рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдЯрд▓рд┐рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ java.io.File рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, path рдЕрдкрдиреЗ рд╣реА File рд╡рд░реНрдЧ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдПрдХ рдпрд╛ рджреЛ рдорд┐рдирдЯ рдореЗрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ () рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рддрд░реНрдХреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рдХреЛрдЯрд▓рд┐рди - рдпрд╣ рд╕рдм рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдХреЛрдИ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 if (interval <= 0) { println("Interval must be positive") return } 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдЯрд▓рд┐рди рдХреЛрдб рд╣реИ, рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рд╕реЗ рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реЛрдЧрд╛ред

рдЪрд▓реЛ рдирд┐рдпрдорд┐рдд рдХреЛрдЯрд▓рд┐рди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдореЗрдВ рдЬрд╛рд╡рд╛ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ "рдЙрдлрд╝!"ред рдХреНрдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ?

рдЪрд▓реЛ рдЕрдкрдиреЗ while рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╣рд░ interval рдХреБрдЫ рдкреНрд░рддреАрдХ рдЫрд╛рдкрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд╡рдзрд┐ред

 var modified = file.modified() while (true) { if (file.modified() > modified) { println("\nFile copied: ${file.copyAside()}") modified = file.modified() } print(".") // ... Thread.sleep(interval * 1000) } 

Thread рдЬрд╛рд╡рд╛ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рд╣реИред рд╣рдо рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдореЗрдВ рдЬрд╛рд╡рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдХреЛрдЯрд▓рд┐рди рдХреА рдХрдХреНрд╖рд╛рдПрдВред рдХреЛрдИ рдЬрд╛рд╡рд╛ред

рд╡реИрд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ main рд╣рдордиреЗ java.io.File рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛

рдЕрдЪреНрдЫрд╛, рдлрд┐рд░ рдХреНрдпрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? C рд╕реЗ рдХрд╛рд░реНрдп!

 var modified = file.modified() while (true) { if (file.modified() > modified) { println("\nFile copied: ${file.copyAside()}") modified = file.modified() } print(".") sleep(interval) } 

рджреБрдирд┐рдпрд╛ рд╕реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ


рдЕрдм рдЬрдм рд╣рдореЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕ рдЪреАрдЬрд╝ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА File рд╕реЗ рдХреНрдпрд╛ exists() рдлрд╝рдВрдХреНрд╢рди:

 data class File(private val filename: String) { fun exists(): Boolean { return access(filename, F_OK) != -1 } // More functions... } 

File рдПрдХ рд╕рд╛рдзрд╛рд░рдг data class , рдЬреЛ рд╣рдореЗрдВ рдмреЙрдХреНрд╕ рд╕реЗ toString() рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

"рд╣реБрдб рдХреЗ рддрд╣рдд," рд╣рдо access() рдлрд╝рдВрдХреНрд╢рди рд╕реА рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ -1 рд▓реМрдЯрддрд╛ рд╣реИ рдЕрдЧрд░ рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдФрд░ рднреА modified() :

 fun modified(): Long = memScoped { val result = alloc<stat>() stat(filename, result.ptr) result.st_mtimespec.tv_sec } 

рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Boolean ред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо alloc() рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ alloc() ред рдЪреВрдВрдХрд┐ рд╣рдо рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╣рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдореЙрд▓реЛрдХ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рднреА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред memScoped() рдХрд╛ memScoped() рдлрд╝рдВрдХреНрд╢рди memScoped() рд▓рд┐рдП рдЖрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╡рдЬрдирджрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ: opyAside()

 fun copyAside(): String { val state = copyfile_state_alloc() val copied = generateFilename() if (copyfile(filename, copied, state, COPYFILE_DATA) < 0) { println("Unable to copy file $filename -> $copied") } copyfile_state_free(state) return copied } 

рдпрд╣рд╛рдВ рд╣рдо C рдлрдВрдХреНрд╢рди copyfile_state_alloc() рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ copyfile() рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдЬрд╛рд░реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
copyfile_state_free(state)

рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЪреА рд╣реБрдИ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рд╣реИ рдирд╛рдореЛрдВ рдХреА рдкреАрдврд╝реАред рд╡рд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХреЛрдЯрд▓рд┐рди рд╣реИ:

 private var count = 0 private val extension = filename.substringAfterLast(".") private fun generateFilename() = filename.replace(extension, "${++count}.$extension") 

рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рдХреЛрдб рд╣реИ рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред

рдкреНрд░рд╛рд░рдВрдн


рдЕрдм рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП?

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╡рд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрдХреБрдЫ рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рдВ, рдФрд░ рдХреБрдЫ рд╕реАрдЖрдИ CLION рд╕реЗ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛рдПрдВрдЧреЗред

 ./gradlew build && ./build/konan/bin/macos_x64/file_watcher.kexe ./README.md 1 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЧреНрд░реИрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реБрдЖ, рддреЛ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 BUILD SUCCESSFUL in 16s 

рд╕реЛрд▓рд╣ рд╕реЗрдХрдВрдб! рд╣рд╛рдВ, JVM рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧреЛ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЛрдЯрд▓рд┐рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИред рдФрд░ рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред

рдЕрдм рдЖрдкрдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдкрд╛рд░ рдбреЙрдЯреНрд╕ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдХреБрдЫ рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреА рддрд░рд╣:

 ................................ File copied: ./README.1.md ................... File copied: ./README.2.md 

рд▓реЙрдиреНрдЪ рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рд▓реЗрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЙрдирд┐рдЯрд░: 852KBред рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ!

рдХреБрдЫ рдирд┐рд╖реНрдХрд░реНрд╖


рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдХреА рдорджрдж рд╕реЗ рд╣рдо рдПрдХ рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕реА рдЧреЛ рд╕реЗ рдХрдо рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрддрдирд╛? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред

рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ? рдЧреЛ рдпрд╛ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдХрд╛ рдЕрдм рддрдХ рдЗрд╕рд╕реЗ рдмреБрд░рд╛ рдирд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 2017 рдореЗрдВ JetBrains рдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА ред рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреЛрдЯрд▓рд┐рди рдореВрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рднреА рдирд╣реАрдВ рд╣реИрдВ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЕрднреА рднреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВред

рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрд░реЙрд╕рдкреНрд▓реЗрдЯ рд░рд┐рдХреЙрд░реНрдбрд░ рд╡рд┐рдХрд╛рд╕ред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ C рд╕реЗ рдмрдбрд╝реЗ рдореЗрд░реЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рдХрд┐ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг OSX рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ platform.darwin рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╡рд░рдг рд╣реЛрдВрдЧреЗ рдЬреЛ рдЗрд╕реЗ рдордВрдЪ рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЖрдк рд╕рднреА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдореЗрд░реЗ рдореВрд▓ рд▓реЗрдЦ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ , рдЕрдЧрд░ рдЖрдк рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдкрдврд╝рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/hi435220/


All Articles