วิธีรับพา ธ โฟลเดอร์สำหรับแอปพลิเคชัน ClickOnce


160

ฉันจำเป็นต้องเขียนไฟล์ในโฟลเดอร์เดียวกันกับที่มีคอนโซล ClickOnce .application(ไฟล์เรียกทำงาน) อยู่ โฟลเดอร์ที่เปิดใช้งาน

ฉันลองใช้Application.StartupPath& Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) แต่พา ธ ชี้ไปที่โฟลเดอร์ย่อยด้านc:\Documents & Settingsล่าง ฉันจะได้รับเส้นทางที่.applicationอยู่อาศัยได้อย่างไร

คำตอบ:


253

ในการค้นหาตำแหน่งโฟลเดอร์คุณสามารถเรียกใช้แอปเปิดตัวจัดการงาน (CTRL-SHIFT-ESC) เลือกแอพและคลิกขวา | เปิดตำแหน่งไฟล์


3
เฮ้เคล็ดลับโปร! แต่มันไม่พร้อมใช้งานบนเครื่อง Crappy XP รุ่นเก่า :)
Jalal

5
@Jalal สำหรับ "เครื่องจักรเส็งเคร็งเก่า" ไปที่ www.SysInternals.com และดาวน์โหลด Process Explorer ฉันสงสัยว่าการเปลี่ยนแปลงใน TaskManager ของ Win7 และ Win8 นั้นเพิ่งถูกคัดลอกมาจากมัน
Arioch 'The

1
คุณจะประสบความสำเร็จในแอปพลิเคชันของคุณที่ทำงานบนคอมพิวเตอร์ของลูกค้าได้อย่างไร
user3285954

2
หากฉันไม่สามารถเรียกใช้แอปพลิเคชันได้เพราะจะลบไฟล์บันทึกที่ฉันต้องการอย่างยิ่ง
Tomáš Zato - Reinstate Monica

2
@Tony_Henrich คุณควรทำเครื่องหมายว่านี่เป็นคำตอบที่ถูกต้อง
sparkyShorts

120

เส้นทางชี้ไปที่โฟลเดอร์ย่อยภายใต้ c: \ Documents & Settings

ถูกตัอง. ClickOnce applicationsถูกติดตั้งภายใต้โปรไฟล์ของผู้ใช้ที่ติดตั้ง คุณใช้เส้นทางที่รับข้อมูลจากชุดประกอบที่ให้มาและไปตรวจสอบดูหรือไม่?

ใน windows Vista และ Windows 7 คุณจะพบแคช ClickOnce ที่นี่:

c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

ใน Windows XP คุณจะพบได้ที่นี่:

C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

1
ฉันเข้าใจทั้งหมดนี้ ฉันต้องการโฟลเดอร์จากที่ฉันคลิกบนแอพ ฉันไม่สามารถเข้าถึง C: \ Documents และการตั้งค่าได้ดังนั้นฉันจะไม่สามารถเข้าถึงไฟล์บันทึกได้หากฉันจะใช้เส้นทางโฟลเดอร์ที่ส่งคืนโดยฟังก์ชั่นนั้นและฉันไม่ต้องการใช้ค่าเส้นทางฮาร์ดโค้ด .
Tony_Henrich

25

ApplicationDeployment.CurrentDeployment.ActivationUriอาจทำงานได้

"สตริงที่มีความยาวเป็นศูนย์ถ้าคุณสมบัติ TrustUrlParameters ในรายการการปรับใช้เป็นเท็จหรือหากผู้ใช้ให้ UNC เพื่อเปิดการปรับใช้หรือเปิดภายในเครื่องมิฉะนั้นค่าส่งคืนจะเป็น URL แบบเต็มที่ใช้เรียกแอปพลิเคชัน รวมถึงพารามิเตอร์ใด ๆ "


แต่สิ่งที่ฉันคิดว่าคุณต้องการจริงๆคือApplicationDeployment.CurrentDeployment.DataDirectoryซึ่งให้โฟลเดอร์ที่คุณสามารถเขียนข้อมูลได้ เมื่อคุณอัปเดตแอปพลิเคชันอย่างไรก็ตามคุณจะสูญเสียสิ่งที่อยู่ในโฟลเดอร์. exe เดิม แต่คุณสามารถย้ายไดเรกทอรีข้อมูลไปยังแอปเวอร์ชันใหม่ แอปของคุณสามารถเขียนลงในโฟลเดอร์นี้ได้โดยมีไฟล์บันทึกอะไรก็ตาม - และฉันค่อนข้างมั่นใจว่ามันรับรองว่าจะสามารถเขียนได้


ฉันไม่ได้ทำอะไรเลย แต่ไฟล์จาก DataDirectory เก่าจะถูกคัดลอกไปยัง DataDirectory ใหม่โดยอัตโนมัติหลังจากการปรับใช้ ไม่มีไดเรกทอรี. pre เช่นกัน (.NET Framework 3.5 และ 4.5)
Der_Meister

15

ฉันใช้Assembly.GetExecutingAssembly().Locationเพื่อรับเส้นทางไปยังClickOnceแอปพลิเคชันที่ปรับใช้ใน. Net 4.5.1

อย่างไรก็ตามคุณไม่ควรเขียนไปยังโฟลเดอร์ใด ๆ ที่แอปพลิเคชันของคุณถูกนำไปใช้งานโดยไม่คำนึงถึงวิธีการปรับใช้ (เช่น xcopy, ClickOnce, InstallShield, อะไรก็ได้) เพราะโดยทั่วไปมักจะอ่านเฉพาะแอปพลิเคชันโดยเฉพาะใน Windows รุ่นใหม่

แอปจะต้องเขียนไปยังโฟลเดอร์ที่สงวนไว้เพื่อวัตถุประสงค์ดังกล่าวเสมอ คุณสามารถรับโฟลเดอร์ที่คุณต้องการเริ่มต้นจาก Environment.SpecialFolder Enumeration หน้า MSDN อธิบายถึงสิ่งที่แต่ละโฟลเดอร์ใช้สำหรับ: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

คือข้อมูลที่บันทึกและไฟล์อื่น ๆ หนึ่งสามารถใช้ApplicationData(โรมมิ่ง) LocalApplicationData(ท้องถิ่น) CommonApplicationDataหรือ สำหรับไฟล์ชั่วคราวใช้หรือPath.GetTempPathPath.GetTempFileName

การทำงานด้านบนเซิร์ฟเวอร์และเดสก์ท็อปด้วย

แก้ไข: Assembly.GetExecutingAssembly()เรียกว่าในปฏิบัติการหลัก


สิ่งนี้ได้ผลสำหรับฉันสำหรับแอป ClickOnce รวมถึงทำงานในสภาพแวดล้อม VS dev ในขณะที่ทำการดีบักแอปเดียวกันนั้น
Developer63

3

การใช้งาน ClickOnce DOอาศัยอยู่ในไดเรกทอรีย่อยของ C: \ Documents และการตั้งค่า พวกเขาไม่มีไดเรกทอรีการติดตั้ง "สะอาด" เนื่องจากไฟล์ในเครื่องนั้นดาวน์โหลด "ชั่วคราว" เป็นหลักเพื่อให้แอปพลิเคชันทำงานบนพีซีในระบบและการควบคุมการทำงานของแอปพลิเคชันจากเซิร์ฟเวอร์ ClickOnce ที่ติดตั้งขึ้นอยู่กับการตั้งค่าการเผยแพร่ (กำลังตรวจหาการอัปเดตข้อกำหนดของรุ่น ฯลฯ )


ฉันไม่สามารถเข้าถึงโฟลเดอร์ C: \ Documents & Settings บนเซิร์ฟเวอร์ซึ่งหมายความว่าฉันไม่สามารถเข้าถึงไฟล์ที่แอปสร้างขึ้น ฉันเรียกใช้แอพจากโฟลเดอร์ที่แน่นอน เป็นโฟลเดอร์ที่แอพเผยแพร่ ฉันจะหาเส้นทางของโฟลเดอร์นั้นได้อย่างไร
Tony_Henrich

โอ้คุณต้องการ URL การปรับใช้ ขออภัยฉันไม่ได้รับสิ่งนั้นเลย คุณกำลังพยายามเรียกใช้จากภายในแอปพลิเคชัน ClickOnce หรือจากแอปพลิเคชันภายนอกหรือไม่
RobinDotNet

1

นี่คือสิ่งที่ฉันพบว่าทำงานได้เพื่อให้สามารถรับตำแหน่งโฟลเดอร์ที่ปรับใช้แล้วของแอปพลิเคชัน Clickonce ของฉันและไม่ได้ถูกกล่าวถึงที่ใดก็ตามที่ฉันเห็นในการค้นหาของฉันสำหรับสถานการณ์เฉพาะที่คล้ายกันของฉัน:

  • แอปพลิเคชั่น clickonce นั้นได้รับการปรับใช้กับโฟลเดอร์เครือข่าย LAN ของ บริษัท
  • แอปพลิเคชัน Clickonce ถูกตั้งค่าให้พร้อมใช้งานออนไลน์หรือออฟไลน์
  • URL การติดตั้ง Clickonce ของฉันและอัปเดต URL ในคุณสมบัติโครงการของฉันไม่มีอะไรระบุ กล่าวคือไม่มีตำแหน่งที่ตั้งแยกต่างหากสำหรับการติดตั้งหรือการปรับปรุง
  • ในตัวเลือกการเผยแพร่ของฉันฉันได้สร้างทางลัดบนเดสก์ท็อปสำหรับแอปพลิเคชัน Clickonce
  • โฟลเดอร์ที่ฉันต้องการหาพา ธ สำหรับตอนเริ่มต้นคือโฟลเดอร์ที่ฉันต้องการเข้าถึงได้โดยแอปพลิเคชันรุ่น DEV, INT และ PROD โดยไม่ต้องเข้ารหัสฮาร์ดไดรฟ์

นี่คือภาพของกรณีการใช้งานของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

  • โฟลเดอร์ที่บรรจุกล่องสีน้ำเงินเป็นที่ตั้งไดเรกทอรีของฉันสำหรับแอพพลิเคชั่นของแต่ละสภาพแวดล้อม
  • โฟลเดอร์กล่องแดงเป็นไดเรกทอรีที่ฉันต้องการหาพา ธ (ซึ่งต้องได้รับตำแหน่งโฟลเดอร์ที่ปรับใช้ของแอป "MyClickOnceGreatApp_1_0_0_37" ซึ่งเป็นเหมือนกับ OP)

ฉันไม่พบข้อเสนอแนะใด ๆ ในคำถามนี้หรือความคิดเห็นของพวกเขาเพื่อทำงานในการส่งคืนโฟลเดอร์ที่มีการใช้งานแอปพลิเคชัน clickonce (ซึ่งฉันจะย้ายไปสัมพันธ์กับโฟลเดอร์นี้เพื่อค้นหาโฟลเดอร์ที่น่าสนใจ) ไม่มีการค้นหาทางอินเทอร์เน็ตหรือคำถาม SO อื่น ๆ ที่เกี่ยวข้องทำให้เกิดคำตอบอย่างใดอย่างหนึ่ง

คุณสมบัติที่แนะนำทั้งหมดอาจล้มเหลวเนื่องจากวัตถุ (เช่น ActivationUri) เป็นโมฆะหรือชี้ไปที่โฟลเดอร์แอปที่ติดตั้งแคชของพีซีในระบบ ใช่ฉันสามารถจัดการวัตถุที่เป็นโมฆะได้อย่างสง่างามโดยการตรวจสอบ IsNetworkDeployed - นั่นไม่ใช่ปัญหา - แต่น่าแปลกใจที่ IsNetworkDeployed คืนค่าเท็จแม้ว่าในความเป็นจริงฉันมีตำแหน่งโฟลเดอร์ที่ติดตั้งเครือข่ายสำหรับแอปพลิเคชัน Clickonce นี่เป็นเพราะแอปพลิเคชันทำงานจากบิตที่แคชในเครื่อง

วิธีแก้คือดูที่:

  • AppDomain.CurrentDomain.BaseDirectory เมื่อแอปพลิเคชันถูกเรียกใช้ภายใน Visual Studio ขณะที่ฉันพัฒนาและ
  • System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation เมื่อมันกำลังดำเนินการตามปกติ

System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocationส่งคืนไดเรกทอรีเครือข่ายที่ใช้งานแอปพลิเคชัน Clickonce ของฉันอย่างถูกต้องในทุกกรณี นั่นคือเมื่อมีการเปิดตัวผ่าน:

  • setup.exe
  • MyClickOnceGreatApp.application
  • ทางลัดบนเดสก์ท็อปที่สร้างขึ้นเมื่อติดตั้งและเปิดใช้แอปพลิเคชันเป็นครั้งแรก

นี่คือรหัสที่ฉันใช้เมื่อเริ่มต้นแอปพลิเคชันเพื่อรับเส้นทางของโฟลเดอร์ WorkAccounts การรับโฟลเดอร์แอปพลิเคชั่นที่ปรับใช้นั้นง่ายมากโดยไม่ต้องเดินไปที่ไดเรกทอรีหลัก:

string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
    directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
    try
    {
        string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
        path = path.Replace("file:", "");
        path = path.Replace("/", "\\");
        directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
    }
    catch (Exception ex)
    {
        directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
    }
}

0

สมมติว่าคำถามเกี่ยวกับการเข้าถึงไฟล์ในโฟลเดอร์แอปพลิเคชันหลังจากแอปพลิเคชัน ClickOnce (จริง == System.Deployment.ApplicationDeploy.IsNetworkDeployed) ติดตั้งบนพีซีของผู้ใช้ซึ่งเป็นวิธีสามวิธีในการรับโฟลเดอร์นี้โดยแอปพลิเคชันเอง:

String path1 = System.AppDomain.CurrentDomain.BaseDirectory;
String path2 = System.IO.Directory.GetCurrentDirectory();    
String path3 = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; //Remove the last path component, the executing assembly itself.

สิ่งเหล่านี้ทำงานจาก VS IDE และจากแอพ ClickedOnce ที่ถูกปรับใช้ / ติดตั้งไม่มี "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed" ที่จำเป็น ClickOnce รับไฟล์ใด ๆ ที่รวมอยู่ในโครงการ Visual Studio 2017 ดังนั้นจริงๆแล้วแอปพลิเคชันสามารถเข้าถึงไฟล์ที่ใช้งานใด ๆ และทั้งหมดโดยใช้พา ธ สัมพัทธ์จากภายในแอปพลิเคชัน

นี้จะขึ้นอยู่บน Windows 10 และ Visual Studio 2017

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.