मैंने एक नेट विंडोज़ फॉर्म एप्लिकेशन लिखा है जो लॉगफाइल और उपयोगकर्ता खातों को स्टोर करने के लिए सामान्य एप्लिकेशन डेटा फ़ोल्डर का उपयोग करता है। एप्लिकेशन को इंस्टॉल शील्ड प्रोजेक्ट का उपयोग करके वितरित किया जाता है और सभी अलग-अलग विंडोज संस्करणों पर सही चलता है।

विभिन्न फाइलों से कोड के कुछ हिस्से नीचे दिखाए गए हैं

// Defining the path to use (in ProductInfo class)
public static string CommonApplicationDataPath
{
    get
    {
        string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
        path = StringHelper.EnsureEndsWithSlash(path);
        path += Vendor + @"\" + ProductName + @"\";

        return path;
    }
}

// Configuring the logger and user manager instances at startup
Logger.Configure(string.Empty, ProductInfo.Password, ProductInfo.CommonApplicationDataPath);
UserManager.Configure(User.Empty, ProductInfo.Password, ProductInfo.CommonApplicationDataPath, 
    ProductInfo.UserLimitCount);

// Example method for saving the users to file (in UserManager class)
public bool SaveUsers(AppUsers appUsers)
{
    AppUsersSerializer serializer = new AppUsersSerializer(_password, _fileName);

    if (serializer.Serialize(appUsers) == true)
    {
        return true;
    }
    else
    {
        Logger.Instance.Log(Logs.ErrorB.UserSave, _fileName);
        return false;
    }
}

अब मैं विंडोज़ स्टोर के माध्यम से एप्लिकेशन को प्रकाशित करना चाहता हूं और एमएसआईएक्स पैकेजिंग टूल का उपयोग किया है। पैकेज पर हस्ताक्षर करने के लिए मैंने एक स्व-हस्ताक्षरित प्रमाणपत्र बनाया है और इसे विश्वसनीय रूट प्रमाणपत्र प्राधिकरणों में जोड़ा है। .msix पैकेज उसी पीसी पर स्थापित है जिस पर ऐप का मेरा पुराना डेस्कटॉप संस्करण है।

मेरे पास समस्या यह है कि एप्लिकेशन CommonApplicationData फ़ोल्डर में स्थित फ़ाइलों को लिखने में सक्षम नहीं है। एप्लिकेशन डेटा को पढ़ और लोड कर सकता है, लेकिन अपडेट नहीं कर सकता और फाइलों में परिवर्तन लिख सकता है। इस प्रकार, फ़ाइलों का पथ सही है, लेकिन कुछ लिखने की अनुमति गायब प्रतीत होती है। मैंने पैकेज पर विभिन्न क्षमताओं की कोशिश की है और यहां तक ​​कि सभी पर निशान लगा दिया है, लेकिन बिना किसी प्रभाव के।

मैंने C:\Program Files\WindowsApps\<my app package>\ फ़ोल्डर में भी ब्राउज़ किया है और एप्लिकेशन की संरचना की जांच की है और फाइलों का पता लगाया है। वे वहां हैं, लेकिन केवल ऐप के लिए पठनीय हैं। फ़ाइलों को हटाने से नए नहीं बनेंगे जब उन्हें पुराने डेस्कटॉप विंडोज फॉर्म संस्करण में जोड़ा जाना चाहिए।

एप्लिकेशन काफी बड़ा है और इसमें बहुत सारी कार्यक्षमता है जो विंडोज स्टोर ऐप के संदर्भ में बहुत अच्छी चलती है। फ़ाइल लेखन के साथ उपर्युक्त मुद्दों का एकमात्र गायब टुकड़ा है।

किसी भी सलाह की वास्तव में सराहना की जाएगी।

0
Gustav 28 जिंदा 2020, 22:39

3 जवाब

सबसे बढ़िया उत्तर

कुछ अलग-अलग वेबसाइटों पर लगातार खोज करने के बाद मुझे अपनी समस्या के लिए एक व्यवहार्य समाधान मिला।

माइक्रोसॉफ्ट एमएसडीएन ब्लॉग ने वर्णन किया कि विभिन्न फ़ोल्डरों को उचित तरीके से कैसे उपयोग किया जाए।

http://blogs.msdn.microsoft.com/appconsult/2017/03/06/handling-data-in-a-converted-desktop-app-with-the-desktop-bridge/

प्रस्तावित समाधान बदलना है:

string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);

प्रति:

string path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

यह फ़ाइलों को उपयोगकर्ता की स्थानीय निर्देशिका में रखेगा, जिसका अर्थ है कि डेटा केवल वर्तमान उपयोगकर्ता के लिए उपलब्ध होगा। एप्लिकेशन के विभिन्न उपयोगकर्ताओं के बीच एक ही लॉग फ़ाइल और उपयोगकर्ता खातों को साझा करना संभव नहीं होगा, लेकिन यह अभी के लिए ठीक है।

आपको यह सुनिश्चित करने की भी आवश्यकता हो सकती है कि फ़ोल्डर मौजूद है: C:\Users\<user>\AppData\Local\<vendor>\<product> क्योंकि यह आपके एप्लिकेशन की स्थापना के दौरान हमेशा नहीं बनाया जा सकता है। यह निर्भर करता है कि इसमें उपयोगकर्ता विशिष्ट सेटिंग्स हैं या नहीं।

1
Gustav 30 जिंदा 2020, 23:31

CommonApplicationData फ़ोल्डर MSIX पैकेजिंग टूल का उपयोग करने के बाद केवल पढ़ने के लिए

यदि आपने अपने ऐप को स्टोर ऐप में बदल दिया है, तो हम इसे यूडब्ल्यूपी ऐप के रूप में मान सकते हैं, सामान्य तौर पर, हम उपयोगकर्ता जानकारी को LocalSettings क्लास जो ऐप को अपडेट होने के दौरान डेटा रख सकती है।

var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

// Create a simple setting.
localSettings.Values["exampleSetting"] = "Hello Windows";

// Read data from a simple setting.
Object value = localSettings.Values["exampleSetting"];

if (value == null)
{
    // No data.
}
else
{
    // Access data in value.
}

// Delete a simple setting.
localSettings.Values.Remove("exampleSetting");

अधिक विवरण के लिए, कृपया देखें सेटिंग और अन्य ऐप्लिकेशन डेटा संग्रहीत और पुनर्प्राप्त करें

0
Nico Zhu - MSFT 29 जिंदा 2020, 08:16

उत्तर के लिए धन्यवाद, लेकिन मैं पर्याप्त विशिष्ट नहीं था।

मैं नेट फ्रेमवर्क 4 क्लाइंट प्रोफाइल के साथ फंस गया हूं और आदर्श रूप से कोड को डेस्कटॉप रिलीज दोनों के साथ संगत होना पसंद करूंगा, इंस्टाल शील्ड प्रोजेक्ट और यूडब्ल्यूपी विंडोज स्टोर का उपयोग कर रहा हूं।

प्रस्तावित समाधान Windows.Storage का उपयोग करता है जो वर्तमान संदर्भ में उपलब्ध नहीं है।

यदि सामान्य कोड एक विकल्प नहीं है तो विंडोज स्टोर रिलीज के लिए .Net 4 का उपयोग करके एक वैकल्पिक हल हो सकता है जिसे लागू किया जा सकता है।

0
Gustav 29 जिंदा 2020, 22:31