איך לקבל בקוד רפרנס של קובץ שנמצא בקליפבורד דרך RDP?
-
כולנו מכירים את "העתק-הדבק" של קבצים.
אם בקוד אני רוצה לדעת את שם הקובץ להעתקה (אחרי פעולת "העתק") אני יכול להשתמש בקוד הבא:Clipboard.GetFileDropList(0)
ואז אני יכול להעתיק אותו בקוד, כי יש לי את הנתיב.
הבעייה שלי:
אני רוצה להעתיק על המחשב שלי, ולהדביק בקוד בשרת RDP (במקרה שלי: WIN SERVER 2008 R2).
אז להדביק רגיל הוא נותן, אבל לא לקבל את הנתיב באמצעות הקוד הנ"ל.בעבר (WIN XP), בהעתקה לRDP ווינדוס היה מעביר את הקובץ לקליפבורד של המחשב השני, ואז הייתה אפשרות להדביק [מהתיקייה הזמנית של המחשב המקומי], היום מייקרוסופט שינו את זה (לטובה!) והקובץ לא מועתק לשום מקום עד שלא עושים "הדבק" והווינדוס שומר את הרפרנס בלבד.
נסיתי לחפש בגוגל איך מוצאים את הרפרנס להעתקה, אני דיי בטוח שזה כתובת בסיגנון של:
\\tcpclient\c\bla.doc
אבל לא ממש מוצא איפה נמצאת הכתובת
רעיונות?
פורסם במקור בפורום CODE613 ב11/06/2014 00:53 (+03:00)
-
אצלי עובד, אבל עם באג חמור...
הרצתי קוד VB.NET, ע"ג מחשב מרוחק (SERVER 2003) והוא הציג כתובת שהועתקה במחשב המקומי (WIN7). פורמט הכתובת בדיוק כמו שציינת.
הנה הקוד:Dim IsContains = My.Computer.Clipboard.ContainsFileDropList Console.WriteLine(IsContains) If IsContains Then Console.WriteLine(My.Computer.Clipboard.GetFileDropList(0))
הפלט:
True \\tsclient\C\Users\shmuel\Desktop\PC07.pptx
אבל! אחרי הרצת הקוד, ההדבקה ננעלת על הכתובת הזו!
כל ההעתקות מכאן ואיך במחשב המקומי מדביקים בשרת את הקובץ ההוא...
מוזר, ומעניין שלא מצאתי שום אזכור לבאג ברחבי הרשת.פורסם במקור בפורום CODE613 ב11/06/2014 13:23 (+03:00)
-
@דוד ל.ט.
אצלי עובד, אבל עם באג חמור...
הרצתי קוד VB.NET, ע"ג מחשב מרוחק (SERVER 2003) והוא הציג כתובת שהועתקה במחשב המקומי (WIN7). פורמט הכתובת בדיוק כמו שציינת.
הנה הקוד:Dim IsContains = My.Computer.Clipboard.ContainsFileDropList Console.WriteLine(IsContains) If IsContains Then Console.WriteLine(My.Computer.Clipboard.GetFileDropList(0))
הפלט:
True \\tsclient\C\Users\shmuel\Desktop\PC07.pptx
אבל! אחרי הרצת הקוד, ההדבקה ננעלת על הכתובת הזו!
כל ההעתקות מכאן ואיך במחשב המקומי מדביקים בשרת את הקובץ ההוא...
מוזר, ומעניין שלא מצאתי שום אזכור לבאג ברחבי הרשת.כי הוא שומר את ההעתקה בבאפר שלו. (זה גם מה שהיה בXP)
אח"כ הם תיקנו את זה....
אבל! הקוד הנ"ל פשוט לא עובד בWIN7 מול SERVER 2008 R2.....לא מבין למה... - נראה לי שהם רצו לתקן משהו אחד, ונמצאו מקלקלים דבר אחר....
פורסם במקור בפורום CODE613 ב11/06/2014 22:06 (+03:00)
-
אני פשוט משתגע מזה.
שרפתי ע"ז כבר הרבה שעות, ובחיפוש בגוגל נראה שהרבה מדברים ע"ז, אבל ללא פיתרון.נכון לעכשיו מה שאני מבין זה:
לקליפבורד יש זיכרון חי.
לכל מה שנשמר שם יש פורמט מסויים.
יש רשימה סגורה של פורמטים ידועים מראש, אבל כל מתכנת יכול ליצור לעצמו פורמט משלו.
ועכשיו לקובץ.
הפורמט של קובץ הוא FileDrop, אבל כשמעתיקים מRDP אז מה שנשמר בזיכרון זה לא FileDrop אלא משהו אחר.
נסיונות לאתר איזה פורמטים יכולים להיות "מומרים" לפורמט תיקני מחזירים 3 תוצאות:
ע"י הפונקצייה:data.GetFormats( True) - data.GetFormats( True) {Length=3} String() (0) "FileGroupDescriptorW" String (1) "FileContents" String (2) "Preferred DropEffect" String
3 התוצאות הם בעצם פרטים על שם הקובץ והפעולה (העתקה, העברה וכו') אבל לא איפה הקובץ.
ההשערה שלי היא שכנראה הקובץ עצמו יושב בפורמט פנימי של מייקרוסופט (כמו שכל מתכנת יכול להגדיר לעצמו פורמט) ולכן הפונקצייה הנ"ל לא מוצאת אותו - (כי כנראה היא מכירה רק את הפורמטים ה"סגורים")חיפוש באינטרנט מה שמו של הפורמט הזה לא הניב תוצאות מספקות לעת עתה.
רעיונות?
פורסם במקור בפורום CODE613 ב10/08/2014 00:56 (+03:00)
-
כמובן, בסוף זה היה FileContents, למרות שזה לא עבד לי בהתחלה ואני לא מבין למה
הנה הקוד להדבקת קובץ מRDP (שימו לב שזה לא עובד בהדבקה מקומית, וצריך לבדוק אם יש קבצים בFileDrop) :
Dim data As IDataObject = Clipboard.GetDataObject If data.GetDataPresent("FileContents", True) Then Dim newFile As String = Path.Combine("c:\", "a.Pdf") Dim memoryStream As MemoryStream = data.GetData("FileContents") ' Create a FileStream object to write a stream to a file Using fileStream As FileStream = System.IO.File.Create(newFile, CInt(memoryStream.Length)) ' Fill the bytes[] array with the stream data Dim bytesInStream As Byte() = New Byte(memoryStream.Length - 1) {} memoryStream.Read(bytesInStream, 0, CInt(bytesInStream.Length)) ' Use FileStream object to write to the specified file fileStream.Write(bytesInStream, 0, bytesInStream.Length) End Using End If
עכשיו נשאר לראות אם אפשר להמיר לVBA, או שצריך להשתמש בInterop
פורסם במקור בפורום CODE613 ב10/08/2014 01:32 (+03:00)
-
כמובן, בסוף זה היה FileContents, למרות שזה לא עבד לי בהתחלה ואני לא מבין למה
הנה הקוד להדבקת קובץ מRDP (שימו לב שזה לא עובד בהדבקה מקומית, וצריך לבדוק אם יש קבצים בFileDrop) :
Dim data As IDataObject = Clipboard.GetDataObject If data.GetDataPresent("FileContents", True) Then Dim newFile As String = Path.Combine("c:\", "a.Pdf") Dim memoryStream As MemoryStream = data.GetData("FileContents") ' Create a FileStream object to write a stream to a file Using fileStream As FileStream = System.IO.File.Create(newFile, CInt(memoryStream.Length)) ' Fill the bytes[] array with the stream data Dim bytesInStream As Byte() = New Byte(memoryStream.Length - 1) {} memoryStream.Read(bytesInStream, 0, CInt(bytesInStream.Length)) ' Use FileStream object to write to the specified file fileStream.Write(bytesInStream, 0, bytesInStream.Length) End Using End If
עכשיו נשאר לראות אם אפשר להמיר לVBA, או שצריך להשתמש בInterop
נאלצתי להסיר את הV שמסמן שהנושא נפתר.
- כמו שדוד התלונן, הוא נתקע לפעמים בזיכרון על הקובץ המסויים שהעתקתי.
- יש פעמים שהוא בכלל לא מזהה שיש משהו בקליפבורד, כאשר יש בבירור, (הראייה שלי שיש זה שהאקספלורר כן נדביק את הקובץ הנכון)
אני מחפש בינתיים אפשרות להדביק את הקובץ ע"י פקודת הדבק בCMD (בלינוקס אני זוכר שיש פקודה דומה - אבל בווינדוס לא מצאתי עדיין.)
פורסם במקור בפורום CODE613 ב10/08/2014 23:32 (+03:00)