рдЬрдм рдЖрдк рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдЖрдк рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрд╡реАрдПрдо, рд░реВрдмреА рдпрд╛ рдкрд╛рдпрдерди рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рднреА рд▓реЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдФрд░ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдордд рдХрд░реЛред
рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдЬрдм рднреА рдореБрдЭреЗ рдРрд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реБрдИ, рдореИрдВрдиреЗ рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдЧреЛ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдПрдХ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдорд┐рд▓рддреА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдФрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдХреЛрдЯрд▓рд┐рди рдиреЗ рднреА рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЖрдЬрдорд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ - рдЬреАрд╕реА, рдПрдХ рдПрдХрд▓ рдмрд╛рдЗрдирд░реА, рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ?
рд╣рдореЗрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреА рд╣реИ: рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рд╛рдЗрд▓ рд╡реЙрдЪрд░ рд▓рд┐рдЦреЗрдВред рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдкрде рдФрд░ рд╕реНрдХреИрди рдХреА рдЖрд╡реГрддреНрддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдмрджрд▓ рдЧрдИ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдирдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрд╕рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдиреА рд╣реЛрдЧреАред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
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) {
рдЖрдорддреМрд░ рдкрд░, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдФрд░ рдЙрдирдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рднреА рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рд╣рдореЗрд╢рд╛ рджреЛ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ:
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
рдЬрд╛рд╡рд╛ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рд╣реИред рд╣рдо рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдореЗрдВ рдЬрд╛рд╡рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдХреЛрдЯрд▓рд┐рди рдХреА рдХрдХреНрд╖рд╛рдПрдВред рдХреЛрдИ рдЬрд╛рд╡рд╛ред
рд╡реИрд╕реЗ, рдХреНрдпреЛрдВрдХрд┐
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 }
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
рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╡рд░рдг рд╣реЛрдВрдЧреЗ рдЬреЛ рдЗрд╕реЗ рдордВрдЪ рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЖрдк рд╕рднреА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ
рд╣реИрдВредрдФрд░
рдореЗрд░реЗ рдореВрд▓ рд▓реЗрдЦ рдХрд╛ рдПрдХ
рд▓рд┐рдВрдХ , рдЕрдЧрд░ рдЖрдк рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдкрдврд╝рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ