ورود

View Full Version : سوال: شناسایی عمل باز کردن یک دایرکتوری در برنامه نویسی جاوا



kiarashfir13
جمعه 04 تیر 1395, 03:25 صبح
سلام به دوستان و کارشناسان محترم

امکانش هست با جاوا برنامه ای نوشت که بره توی بک گراند اجرا بشه ؟ منظورم اینه که مثل یک سرویس عمل کنه ؟
یعنی وقتی اجراش کردم اجرا بشه و منتظر بمونه (listener ) تا من یک کاری انجام بدم بعدش بیادبه ازای اون کاری که من کردم یه واکنشی نشون بده ؟؟؟

سوال بعدی من این هست که اگه سوال بالا امکان پذیر باشه میخوام بدونم تو جاوا برای اینکه بفهمم که کاربر وقتی اقدام به باز کردن یک دایرکتوری خاص کرد که خودم از قبل آدرسشو ست کرده باشم یه پیغام به من بده ؟ از کدوم event یا listenner بایداستفاده کرد ؟؟ باز کردن دایرکتوری به وسیله اکسپلورر ویندوز منظورم بود نه به وسیله جاوا ..


برنامه کلی : کلا میخوام یه برنامه بنویسم که مثه خیلی از برنامه های ویندوزی وقتی اجرا میشه بره تو بک گراند . و منتظر بمونه تا من به وسیله اکسپلورر ویندوز روی یک دایرکتوری خاص کلیک کنم که بخوام بازش کنم . در همون لحظه برنامه به من یک پیغام نشون بده مثلا : access denied

vahid-p
شنبه 05 تیر 1395, 07:17 صبح
امکانش هست با جاوا برنامه ای نوشت که بره توی بک گراند اجرا بشه ؟ منظورم اینه که مثل یک سرویس عمل کنه ؟
بله. مثل هر سرویس دیگه ای این کار امکان پذیر است.


یعنی وقتی اجراش کردم اجرا بشه و منتظر بمونه (listener ) تا من یک کاری انجام بدم بعدش بیادبه ازای اون کاری که من کردم یه واکنشی نشون بده ؟؟؟
سیستم عامل کنترل کل سیستم رو در دست داره. هر اتفاقی (Event) ابتدا توسط سیستم عامل گرفته میشه و به برنامه مربوطه ارجاع میده. پس برای Event های مشابه تمام برنامه ها مانند کلیک کردن، سیستم عامل Event رو به برنامه ای خواهد داد که روش فوکوس شده. میشه یه کارایی کرد مثلا یه برنامه شفاف (با 100 درصد شفافیت) ایجاد کرد و اونو جوری قرار داد که بالاتر از هر برنامه ای قرار بگیره. ولی اینکه بشه تمام مدت فوکوس روی برنامه خودت باشه رو نمیدونم. این چیزا معمولا در دست سیستم عامله که چنین اجازه ای بده یا نه.
خودم امتحانش نکردم و بعید میدونم هیچ برنامه ای بتونه اینکار رو انجام بده. اصولا برای ویندوز دایرکتوری در برنامه explorer باز میشه و فکر نکنم کسی بتونه event های اونو بدزده :لبخند:
ولی اگر کاری با زبان های دیگه بشه انجام داد، احتمال زیاد (در بعضی موارد نه) با جاوا هم میشه (چون jni و jna داره برای کار با کتابخانه های زبان C )

اما اینکه بخواید access denied بنویسه، فکر کنم برنامه های دیگه مثل Hide Folders دسترسی های دایرکتوری ها رو تغییر میدن و اینطور نیست که خودشون تمام مدت در حال اجرا باشن.
برای تغییر دسترسی ها (پست سوم): http://stackoverflow.com/questions/664432/how-do-i-programmatically-change-file-permissions

راه ساده تر: از اونجایی که تغییر دسترسی ها از طریق command line ویندوز قابل انجامه، کافیه دستوراتش رو پیدا کنی و از طریق جاوا اون ها رو اجرا کنی (http://www.linglom.com/programming/java/how-to-run-command-line-or-execute-external-application-from-java/) تا قفل کنه یا ... (فقط اگر برنامتون لازمه روی لینوکس و... هم اجرا بشه، قبلش سیستم عامل رو شناسایی کنید و متناسب با سیستم عاملتون کامندهای مناسب رو اجرا کنید)

file permission java 7 سرچ کنی هم نتایج خوبی به دست خواهی آورد، اما روش Command-Line رو پیشنهاد میکنم.

kiarashfir13
یک شنبه 06 تیر 1395, 17:32 عصر
از کمکتون ممنونم

نظرتون دربازه این چیه ؟

watch service (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiiqMDznb_NAhUJthQKHTM0BksQFggeMAA&url=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2F7%2Fd ocs%2Fapi%2Fjava%2Fnio%2Ffile%2FWatchService.html&usg=AFQjCNELKFNxJMc1jqdF0oherqkUzgPdiQ&sig2=4HwM5KxX7rqra_6yIRjUsA)

به نظرتون میتونم از win api برای اینکار استفاده کنم ؟؟؟

متشکرم

vahid-p
یک شنبه 06 تیر 1395, 22:49 عصر
نظرتون دربازه این چیه ؟

watch service (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiiqMDznb_NAhUJthQKHTM0BksQFggeMAA&url=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2F7%2Fd ocs%2Fapi%2Fjava%2Fnio%2Ffile%2FWatchService.html&usg=AFQjCNELKFNxJMc1jqdF0oherqkUzgPdiQ&sig2=4HwM5KxX7rqra_6yIRjUsA)
نه. اگر داکیومنتش رو نگاه کنید برای Add و delete و modify درون فولدر کار میکنه (آموزش (https://examples.javacodegeeks.com/core-java/nio/file-nio/watchevent/java-nio-file-watchevent-example/)).

یک لایبرری هست که event های موس و کیبورد رو به صورت سراسری به برنامتون ارسال میکنه و میتونید از عملیات موس و کیبورد مطلع بشید، حتی اگر درون برنامه خودتون نباشه: https://github.com/kwhat/jnativehook
یکی از کاربردهاش اینه مثلا میخواید نرم افزاری بسازید که تعداد فشرده شدن هر کلید رو در طول روز بشمره. یا مثلا میخواید یک keylogger بسازید. یا یک تعداد کلید میانبر بنویسید که هر جا در سیستم عامل و برنامه ها این کلید ها زده شد، برنامتون واکنشی نشون بده (مثل babylon که وقتی یک کلمه رو انتخاب کنی و کلیدهای میانبر رو بزنی برات ترجمش میکنه و...). این لایبرری چیزی نیست جزاستفاده از jni برای فراخوانی API هایی که با زبان های دیگه نوشته شدن. مثل فایل های dll خود ویندوز و مشابه اون در لینوکس.این لایبرری جزئیات jni رو از ما مخفی کرده و یک نوع رابط بین کدهای جاوا و لایبرری های ویندوزی و لینوکسی و... برای این منظور ایجاد کرده که کار کردن باهاش رو ساده میکنه. (میدونید که با jni و jna میتونید از APIهای ویندوز (یا امثالهم در لینوکس و مک و...) در برنامه جاواتون استفاده کنید).

اما باز همونطور که گفتم باید ببینید سیستم عامل چنین اجازه ای رو به شما میده؟ مثلا در همین لایبرری که از لایبرری (API های) سیستم عامل استفاده میکنه به شما اجازه مصرف event رو نمیده. یعنی شما میتونید از event مطلع بشید اما اون event در برنامه مربوطه هم اجرا میشه (یه کپیش رو به شما میده). توضیحاتش رو بخونید.
پس یه جورایی محدودیت هایی از طرف سیستم عامل دارید.

اینم به خاطر امنیت هست.

بعید میدونم با این لایبرری بتونید کاری که میخواید رو انجام بدید، و برای همین شما ابتدا یک معادل برای اینکاری که میخواید انجام بدید پیدا کنید تا ببینی میشه با جاوا انجامش داد یا نه. من فکر میکنم راهی جز همون Permission ها نباشه. چرا از همین روش استفاده نمیکنید؟
یا ممکنه windows explorer خروجی هایی داشته باشه که بتونید اونها رو مرتبط با برنامتون چک کنید که باز هم دقیقا اون چیزی که میخواید نمیشه.

kiarashfir13
دوشنبه 07 تیر 1395, 21:58 عصر
بازم ممنون

permission اونطوری که من از صحبتاتون فهمیدم و سرچ هایی ک کردم بیشتر حول و حوش write/read هستند . منظورم کاربرد هایی ک دارند اینه که چک کنیم آیا یه دایرکتوری قابلیت نوشتن و یا خوندنو داره یا نه . اگه منظورتون چیز دیگه ای هست ممنون میشم بگین تا کاملا متوجه بشم .

راستش هنوز هیچ عبارت خاصی و یا اصطلاح خاصی برای اینکاری که میخوام بکنم پیدا نکردم . هر چه قدرم میسرچم چیزی گیرم نمیاد . چیزی که میخوام نیستن اصلا

من یه جورایی میخوام با استفاده از جاوا ، به windows explorer یه آپشن اضافه کنم . یعنی بش بگم وقتی اقدام به باز کردن یه دایرکتوری خاص کردم یه dialog box به من نشون بده . فکر نمیکنم کار سختی باشه .ولی مشکل پیدا کردن معادل برای اینکاره . یا یک عبارت کوتاهی که بشه باش این کارو توصیف کرد تا بشه حداقل سرچش کرد .

منظورتون از Command Line چیه ؟ یعنی یک شل اسکریپت بنویسم بعدش بیام این اسکریپتو تو جاوا اجرا کنم ؟

واقعا ازتون ممنونم ولی بخدا بدجوری واسه این برنامه ساده گیر کردم

vahid-p
سه شنبه 08 تیر 1395, 10:53 صبح
تصورتون اشتباهه:


فکر نمیکنم کار سختی باشه
...
بدجوری واسه این برنامه ساده گیر کردم

این یک برنامه ساده نیست و اتفاقا تصور میکنم امکان پذیر نباشه که رو هر دایرکتوری کلیک کردید یک Dialog Box نشون بده. اتفاقا اینکه سیستم عامل اجازه چنین کاری رو بهتون بده عجیبه.

من منظورم Lock کردن فولدر بود. و نه اینکه هر پیغام دلخواهی بشه نشون داد. اینکه بخواید به Windows Explorer قابلیت اضافه کنید، مگه ویندوز سیستم عامل منبع باز است که بخواید تغییرش بدید؟ برای همین گفتم یه نمونه کار نسبتا مشابه پیدا کنید تا اونوقت ببینیم چنین کاری رو میشه انجام داد یا خیر.
اما در لینوکس میتونید سورس سیستم عامل رو تغییر بدید (البته دانش بالایی میخواد). مثلا یکی از نرم افزارهای مشابه Windows Explorer در لینوکس Dolphin هست که میتونید کدش رو ببینید و تغییرش بدید. اما شما به سورس Explorer دسترسی ندارید پس نمیتونید قابلیت هاش رو ارتقا بدید. شما تا به حال شاهد بودید کسی قابلیت های سیستم عامل ویندوز (و نرم افزارهای انحصاریش) رو ارتقا بده به جز شرکت مایکروسافت؟! شما میتونید نرم افزار خودتون و هر نرم افزار متن باز دیگه ای رو تغییر بدید.

تفاوت سیستم عامل متن باز و سیستم عامل انحصاری همینه.

خب شما دو راه دارید:
1- یک معادل Windows Explorer خودتون بنویسید (ولی کاربردی نداره وقتی راه دیگه ای برای دسترسی به همون فولدر از طریق Windows Explorer وجود داره).
2- اگر هدفتون قفل کردن فولدرهاست، میتونید اینکار رو انجام بدید و نیازی به تغییر در Windows Explorer نیست.

این یکی هم که راه نیست: همون کتابخونه ای که گفتم (JNativeHook) کلیک کردن رو باید ببینید میشه فولدر بودن رو تشخیص داد (یه جورایی Windows Explorer اطلاعاتش رو بهت بده) که باز بعید میدونم.

نکته آخر: در چنین مواردی شما حتما باید ببینید سیستم عامل چه رابط هایی (API) رو در اختیارتون گذاشته. فراتر از اون نمیتونید کاری انجام بدید. اینکه برنامتون رو به System Tray ببرید، سیستم عامل API اش رو بهتون داده و به این معنیه اجازه دارید. اینکه میتونید یک Command رو از طریق جاوا اجرا کنید، API اش در سیستم عامل دیده شده. پس اگر برای اینکاری که میخواید انجام بدید API ای در سیستم عامل یا برای Windows Explorer هست که میشه انجام داد، اگر نه خیر. ولی برای سیستم عاملی مثل لینوکس میتونی انجام بدی چون سورسش در اینترنت موجوده و کافیه تغییرش بدید.