WiX আনইনস্টল করার সময় ফাইলগুলি সরানো হচ্ছে


84

আমার অ্যাপ্লিকেশন আনইনস্টল করার সময়, আমি আসল ইনস্টলের পরে যুক্ত সমস্ত ফাইল মুছে ফেলার জন্য উইক্স সেটআপটি কনফিগার করতে চাই । দেখে মনে হচ্ছে এটি আনইনস্টলার কেবলমাত্র ডিরেক্টরি এবং ফাইলগুলি মুছে ফেলে যা মূলত এমএসআই ফাইল থেকে ইনস্টল করা হয়েছিল এবং এটি অ্যাপলিকেশন ফোল্ডারে পরে যুক্ত করা সমস্ত কিছু ছেড়ে দেয়। অন্য কথায়, আনইনস্টল করার সময় আমি ডিরেক্টরিটি মুছে ফেলতে চাই। আমি কেমন করে ঐটি করি?

উত্তর:


83

অন ​​= " আনইনস্টল " দিয়ে মুছে ফেলা উপাদানটি ব্যবহার করুন । এখানে একটি উদাহরণ:

<Directory Id="CommonAppDataFolder" Name="CommonAppDataFolder">
  <Directory Id="MyAppFolder" Name="My">
    <Component Id="MyAppFolder" Guid="*">
      <CreateFolder />
      <RemoveFile Id="PurgeAppFolder" Name="*.*" On="uninstall" />
    </Component>
  </Directory>
</Directory>

হালনাগাদ

এটি 100% কাজ করে না। এটি ফাইলগুলি সরিয়ে ফেলল, তবে অতিরিক্ত ডিরেক্টরিগুলির কোনওটিই নয় - ইনস্টলেশনগুলির পরে তৈরি হওয়া ফাইলগুলি সরানো হয়েছিল। কোন চিন্তা? - প্রিবিরো

দুর্ভাগ্যক্রমে উইন্ডোজ ইনস্টলার সাব-ডাইরেক্টরি সহ ডিরেক্টরি মুছে ফেলার পক্ষে সমর্থন করে না। এই ক্ষেত্রে আপনাকে কাস্টম অ্যাকশনটি অবলম্বন করতে হবে। অথবা, যদি আপনি জানেন যে সাবফোল্ডারগুলি কী, তবে রিফফোল্ডার এবং রিমুফল ফাইলগুলির একটি গুচ্ছ তৈরি করুন।


4
ধন্যবাদ পাভেল তবে এটি 100% কাজ করে না। এটি ফাইলগুলি সরিয়ে ফেলল, তবে অতিরিক্ত ডিরেক্টরিগুলির কোনওটিরই নয় - ইনস্টলেশনগুলির পরে তৈরি করা ফাইলগুলি - সরানো হয়নি। কোন চিন্তা?
pribeiro

ওহ, এই ডিরেক্টরিগুলির অধীনে থাকা ফাইলগুলিও মুছে ফেলা হয়নি।
pribeiro

যখন আপনি মেজর আপগ্রেডগুলিতে ফাইলগুলি (উদাহরণস্বরূপ কনফিগারেশন ফাইলগুলি) 'মাই অ্যাপফোর্ডার' এ রাখবেন, আপনি এই পদ্ধতির সাথে সমস্যা পাবেন। একটি আপগ্রেড দ্বারা সমস্ত ফাইল সরানো হবে।
সাইমন

4
আপনার কোড দিয়ে মাই অ্যাপফোর্ডারে একটি ডিরেক্টরি তৈরি করা সম্ভব? আমার </Component>সংকলন ব্যর্থ হওয়ার পরে যখন আমি একটি ডিরেক্টরি যুক্ত করিFound orphaned Component 'MyAppFolder'.
পিসিক্যাট

4
@PhilipRego দেখুন msdn.microsoft.com/en-us/library/windows/desktop/aa367992.aspx CommonAppDataFolder documenation জন্য।
পাভেল চুচুভা

30

RemoveFolderExওয়াইএক্স-এ ইউটিল এক্সটেনশান থেকে উপাদান ব্যবহার করুন ।
এই পদ্ধতির সাহায্যে সমস্ত উপ-ডিরেক্টরিগুলিও সরানো হয় ( সরাসরি উপাদান ব্যবহারেরRemoveFile বিপরীতে )। এই উপাদানটি এমএসআই ডাটাবেসে অস্থায়ী সারি RemoveFileএবং RemoveFolderটেবিলটিতে যুক্ত করে।


4
সতর্কতা: অপসারণ = "আনইনস্টল" অন ফোল্ডারএক্স ব্যবহার করার সময় এটি একটি আপগ্রেড (ফিক্স 3.9) এর ফোল্ডারটি সরিয়ে দেয়। একই আচরণ RemoveFileএবং RemoveFolder। আপনি যদি আপগ্রেডে ফাইলগুলি রাখতে চান তবে আপনি এই সমস্ত পদ্ধতি ব্যবহার করতে পারবেন না।
সাইমন

@ সিমন আপনি যদি আপগ্রেডে ফাইলগুলি রাখতে চান তবে আপনি কোন পদ্ধতির পরামর্শ দিবেন?
বিজিংটন

@ বিজিংটন: আপনি যখন আপনার ইনস্টলেশন ফোল্ডারে কোনও নির্দিষ্ট আপগ্রেডে নির্দিষ্ট ফাইল রাখতে চান, তারপরে একটি কাস্টম অ্যাকশন ব্যবহার করুন যা কাস্টম কোড কার্যকর করে (যেমন সি # লিখিত হ্যান্ডেলসেটআপ.এক্সে)। কাস্টম কোডটি আপনার ফাইলগুলি আপগ্রে বিতরণ করে আপনার ফাইলগুলিকে আপগ্রেড করে রাখে এবং আনইনস্টলগুলিতে ফাইলগুলি সরিয়ে দেয়।
সাইমন


13

এটি করার জন্য, আমি আনইনস্টল করার জন্য কেবল একটি কাস্টম অ্যাকশন তৈরি করেছি।

ওয়াইএক্স কোডটি এর মতো দেখাবে:

<Binary Id="InstallUtil" src="InstallUtilLib.dll" />

<CustomAction Id="DIRCA_TARGETDIR" Return="check" Execute="firstSequence" Property="TARGETDIR" Value="[ProgramFilesFolder][Manufacturer]\[ProductName]" />
<CustomAction Id="Uninstall" BinaryKey="InstallUtil" DllEntry="ManagedInstall" Execute="deferred" />
<CustomAction Id="UninstallSetProp" Property="Uninstall" Value="/installtype=notransaction /action=uninstall /LogFile= /targetDir=&quot;[TARGETDIR]\Bin&quot; &quot;[#InstallerCustomActionsDLL]&quot; &quot;[#InstallerCustomActionsDLLCONFIG]&quot;" />

<Directory Id="BinFolder" Name="Bin" >
    <Component Id="InstallerCustomActions" Guid="*">
        <File Id="InstallerCustomActionsDLL" Name="SetupCA.dll" LongName="InstallerCustomActions.dll" src="InstallerCustomActions.dll" Vital="yes" KeyPath="yes" DiskId="1" Compressed="no" />
        <File Id="InstallerCustomActionsDLLCONFIG" Name="SetupCA.con" LongName="InstallerCustomActions.dll.Config" src="InstallerCustomActions.dll.Config" Vital="yes" DiskId="1" />
    </Component>
</Directory>

<Feature Id="Complete" Level="1" ConfigurableDirectory="TARGETDIR">
    <ComponentRef Id="InstallerCustomActions" />
</Feature>

<InstallExecuteSequence>
    <Custom Action="UninstallSetProp" After="MsiUnpublishAssemblies">$InstallerCustomActions=2</Custom>
    <Custom Action="Uninstall" After="UninstallSetProp">$InstallerCustomActions=2</Custom>
</InstallExecuteSequence>

ইনস্টলারকাস্টমএকশনস.ডিএলএল-এ অনবরেউনস্টল পদ্ধতির কোডটি (ভিবিতে) এর মতো দেখাবে।

Protected Overrides Sub OnBeforeUninstall(ByVal savedState As System.Collections.IDictionary)
    MyBase.OnBeforeUninstall(savedState)

    Try
        Dim CommonAppData As String = Me.Context.Parameters("CommonAppData")
        If CommonAppData.StartsWith("\") And Not CommonAppData.StartsWith("\\") Then
            CommonAppData = "\" + CommonAppData
        End If
        Dim targetDir As String = Me.Context.Parameters("targetDir")
        If targetDir.StartsWith("\") And Not targetDir.StartsWith("\\") Then
            targetDir = "\" + targetDir
        End If

        DeleteFile("<filename.extension>", targetDir) 'delete from bin directory
        DeleteDirectory("*.*", "<DirectoryName>") 'delete any extra directories created by program
    Catch
    End Try
End Sub

Private Sub DeleteFile(ByVal searchPattern As String, ByVal deleteDir As String)
    Try
        For Each fileName As String In Directory.GetFiles(deleteDir, searchPattern)
            File.Delete(fileName)
        Next
    Catch
    End Try
End Sub

Private Sub DeleteDirectory(ByVal searchPattern As String, ByVal deleteDir As String)
    Try
        For Each dirName As String In Directory.GetDirectories(deleteDir, searchPattern)
            Directory.Delete(dirName)
        Next
    Catch
    End Try
End Sub

11

@ ট্রোন্ডার পরামর্শে এখানে একটি পার্থক্য রয়েছে। আমি একটি ফাইল "ইনস্টল.লগ" মুছে ফেলছি যা আনইনস্টল করার সময় অন্য কাস্টম অ্যাকশন দ্বারা তৈরি হয়:

<Product>
    <CustomAction Id="Cleanup_logfile" Directory="INSTALLFOLDER"
    ExeCommand="cmd /C &quot;del install.log&quot;"
    Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
      <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
        REMOVE="ALL"
      </Custom>
    </InstallExecuteSequence>
</Product>

আমি যতদূর বুঝতে পেরেছি, আমি "রিমুফিল" ব্যবহার করতে পারছি না কারণ এই ফাইলটি ইনস্টলেশন পরে তৈরি করা হয়েছে, এবং এটি কোনও উপাদান গ্রুপের অংশ নয়।


4
পুরো ডিরেক্টরিটি মুছে ফেলার জন্য আমি কিছু পরিবর্তন সহ এই সমাধানটি ব্যবহার করেছি: এক্সেক্স্যান্ড = "সেন্টিমিটার / সি আরডি & quot; [ইনস্টললফোল্ডার] & quot; / s / q"
ডেনিস

@ ডেনিস কীভাবে ইনস্টললফোল্ডার মুছে ফেলবেন, জিতে 10 এটি মুছে ফেলা হবে তবে উইন্ডোজ সার্ভারে 2012 এটি মুছে যায় না।
ইওমারেফ

দুর্দান্ত সমাধান। ধন্যবাদ!
ইউরি কোমরনেটস্কি

আমি বেশ কয়েকটি জিনিস চেষ্টা করেছিলাম - কেউ মনে করে না যে আনইনস্টল করার সময় একটি ফাইল মুছে ফেলা এতটা কঠিন হতে পারে। যদিও এটি আমার জন্য কাজ করেছে - ধন্যবাদ!
ভাগ্যবান লূক

8

এটি @ পাভেল পরামর্শের আরও সম্পূর্ণ উত্তর হবে, আমার জন্য এটি 100% কাজ করছে:

<Fragment Id="FolderUninstall">
    <?define RegDir="SYSTEM\ControlSet001\services\[Manufacturer]:[ProductName]"?>
    <?define RegValueName="InstallDir"?>
    <Property Id="INSTALLFOLDER">
        <RegistrySearch Root="HKLM" Key="$(var.RegDir)" Type="raw" 
                  Id="APPLICATIONFOLDER_REGSEARCH" Name="$(var.RegValueName)" />
    </Property>

    <DirectoryRef Id='INSTALLFOLDER'>
        <Component Id="UninstallFolder" Guid="*">
            <CreateFolder Directory="INSTALLFOLDER"/>
            <util:RemoveFolderEx Property="INSTALLFOLDER" On="uninstall"/>
            <RemoveFolder Id="INSTALLFOLDER" On="uninstall"/>
            <RegistryValue Root="HKLM" Key="$(var.RegDir)" Name="$(var.RegValueName)" 
                    Type="string" Value="[INSTALLFOLDER]" KeyPath="yes"/>
        </Component>
    </DirectoryRef>
</Fragment>

এবং, পণ্য উপাদান অধীনে:

<Feature Id="Uninstall">
    <ComponentRef Id="UninstallFolder" Primary="yes"/>
</Feature>

এই পদ্ধতিরটি আনইনস্টল করে মোছার জন্য ফোল্ডারের কাঙ্ক্ষিত পথ সহ একটি রেজিস্ট্রি মান সেট করে। শেষে, ইনস্টললফোল্ডার এবং রেজিস্ট্রি ফোল্ডার উভয়ই সিস্টেম থেকে সরানো হবে। নোট করুন যে রেজিস্ট্রি করার পথটি অন্য মাতাল এবং অন্যান্য স্থানে থাকতে পারে।


6

ডাব্লুআইএক্স বিশেষজ্ঞ নন তবে কোয়েট এক্সিকিউশন কাস্টম অ্যাকশন চালানো কি এর কোন সম্ভাব্য (সহজ?) সমাধান হতে পারে যা ডাব্লুআইএক্সের এক্সটেনশনগুলির অন্তর্নির্মিত অংশ?

/ এস এবং / কি বিকল্পের সাহায্যে rmdir এমএস ডস কমান্ড চালাতে পারে ।

<Binary Id="CommandPrompt" SourceFile="C:\Windows\System32\cmd.exe" />

এবং কাজটি করার কাস্টম অ্যাকশনটি সহজ:

<CustomAction Id="DeleteFolder" BinaryKey="CommandPrompt" 
              ExeCommand='/c rmdir /S /Q "[CommonAppDataFolder]MyAppFolder\PurgeAppFolder"' 
              Execute="immediate" Return="check" />

তারপরে আপনাকে অনেকগুলি স্থান ডকুমেন্টেড হিসাবে ইনস্টলএক্সেকিউটসেক্সেন্সটি পরিবর্তন করতে হবে।

আপডেট: এই পদ্ধতির সাথে সমস্যা ছিল। পরিবর্তে একটি কাস্টম টাস্ক তৈরি শেষ, কিন্তু এখনও এটি একটি কার্যকর সমাধান হিসাবে বিবেচনা করে, কিন্তু বিশদটি কাজ না করে।


আমি এই বিকল্পটি পছন্দ করি যে আপনি ইনস্টলারের মধ্যে cmd.exe অন্তর্ভুক্ত করছেন। অবশ্যই প্রতিটি মেশিনের এটি থাকবে, এটি সন্ধানের জন্য আপনাকে কেবল ডিরেক্টরি অনুসন্ধান ব্যবহার করতে হবে! :)
ক্যাভম্যান_ডিক

4
এটি করবেন না। 1) আপনি cmd.exeআপনার ইনস্টলারটি এম্বেড করছেন । 2) আপনি স্ক্রিপ্ট তৈরির সময় সিস্টেমে পরিবর্তন আনছেন 3) কোনও রোলব্যাক বিকল্প নেই 4) লক করা ফাইলগুলি সঠিকভাবে মোকাবেলা করবেন না
নিক তিমি

আমার সন্দেহ আছে যে উইন্ডোজ ইনস্টলেশন থেকে কোনও ফাইল বিতরণ করা আইনত। এটি টার্গেট সিস্টেমে কাজ করবে কিনা যা উইন্ডোজের ভিন্ন সংস্করণে চলতে পারে তাও অস্পষ্ট।
পল বি

কোনও ফাইল বিতরণ করা হয়নি। এটি ওএস-এ ইনস্টল করা ফাইলগুলি ব্যবহার করে।
ট্রন্ডা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.