Archiv

Posts Tagged ‘SSD’

SSD, Temporäre Ordner und Ramdisks


Auf SSD müssen ja bekanntlich die Schreibvorgänge auf das Minimum reduziert werden um die Lebensspanne künstlich zu erhöhen. Zusätzlich zu diesen Optimierungen sollte man auch alle temporären Ordner, das sich leider fast jedes Programm selbst festlegt, woanders legen. Am besten in einem RamDisk. Solch ein RamDisk lohnt sich aber erst ab 4GB Arbeitsspeicher, damit man mindestens 1GB abzwacken kann. Empfehlen kann ich aus Erfahrung das kostenlose Programm Dataram RamDisk. Es funktioniert auch auf Windows 7 x64.

Alles was auf dem RamDisk liegt sind natürlich nach dem Neustart weg. Die Ziele der Junctionpoints sind auch weg. Man benötigt also ein Programm, das die Ordner und die Junctionpoints automatisch anlegt.

Das Programm benötigt diese Klasse –> JunctionPoint aus dem Artikel Manipulating NTFS Junction Points in .NET
Die Methode “Delete” habe ich etwas angepasst.


/// <summary>
        /// Deletes a junction point at the specified source directory.
        /// Does nothing if the junction point does not exist.
        /// </summary>
        /// <remarks>
        /// Only works on NTFS.
        /// </remarks>
        /// <param name="junctionPoint">The junction point path</param>
        /// <param name="bDeleteFolder">Delete the specified source directory also</param>
        public static void Delete(string junctionPoint, bool bDeleteFolder = true)

if (bDeleteFolder)
{
    try
    {
        Directory.Delete(junctionPoint);
    }
    catch (IOException ex)
    {
        throw new IOException("Unable to delete junction point.", ex);
    }
}

Eine Liste der Ordner sollte sich unter C:\Windows\ befinden. Der Dateiname sollte lauten “Junction.lst”. Der Inhalt von Junction.lst sollte etwa so aussehen.


C:\Users\%1\Videos\DivX Movies\Temporary Downloaded Files
C:\Users\%1\AppData\Roaming\Macromedia
C:\Users\%1\AppData\LocalLow\DivX\Temporary Downloaded Files
C:\Users\%1\AppData\LocalLow\Microsoft\Silverlight\is
C:\Users\%1\AppData\Local\Temp
C:\Users\%1\AppData\Local\assembly\tmp
C:\Users\%1\AppData\LocalLow\Microsoft\Windows Live\Setup\tmp
C:\Users\%1\AppData\Roaming\Local
C:\Users\%1\AppData\Roaming\Microsoft\Windows\Cookies
C:\Users\%1\AppData\Roaming\Microsoft\Windows\IECompatCache
C:\Users\%1\AppData\Roaming\Microsoft\Windows\IEDownloadHistory
C:\Users\%1\AppData\Roaming\Microsoft\Windows\IETldCache
C:\Users\%1\AppData\Roaming\Microsoft\Windows\PrivacIE
C:\Users\%1\AppData\Local\Opera\Opera\cache
C:\Users\%1\AppData\Local\Opera\Opera\temporary_downloads
C:\Users\%1\AppData\Roaming\Opera\Opera\sessions
C:\Windows\TEMP
C:\ProgramData\Avira\AntiVir Desktop\LOGFILES
C:\ProgramData\Avira\AntiVir Desktop\TEMP
C:\TEMP


%1 wird durch den Anmeldenamen des Benutzers ersetzt. Das Programm unterstützt also mehrere angemeldete Benutzer. Ordner wie “C:\Windows\TEMP” sollte man für alle Freigeben, ansonsten funktioniert das setzen der Junctions nicht.

image

Idealerweise sollte das Programm dann in der Registry im Run eingetragen sein, damit es bei jeder Anmeldung auf jedenfall ausgeführt wird.

Windows x32


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run


Windows x64


HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run


Übrigens … Der Ramdisk muss RAMDISK heissen, sonst findet das Programm es nicht. Alternativ könnt ihr auch die Konstante RAMDISK_NAME ändern.


using System;
using System.IO;
using Monitor.Core.Utilities; // http://www.codeproject.com/KB/files/JunctionPointsNet.aspx

namespace JunctionLord
{
    class Program
    {
        private const string RAMDISK_NAME = "RAMDISK";

        static void Main(string[] args)
        {
            string junctionListPath = Path.Combine(
                Environment.GetEnvironmentVariable("SystemRoot"), "junction.lst");
            bool bHasError = false;

            if (File.Exists(junctionListPath))
            {
                string[] junction = File.ReadAllLines(junctionListPath);

                // Locate the RAMDISK
                string ramDiskRoot = "";
                foreach (DriveInfo drive in DriveInfo.GetDrives())
                {
                    if (drive.DriveType == DriveType.Fixed && drive.IsReady && 
                        drive.VolumeLabel.ToUpper() == RAMDISK_NAME)
                        ramDiskRoot = drive.RootDirectory.FullName;
                }

                if (ramDiskRoot.Length > 0)
                {

                    string junc;
                    string src;
                    string UserName = Environment.UserName;

                    Directory.CreateDirectory(Path.Combine(ramDiskRoot, UserName));
                    for (int x = 0; x < junction.Length; x++)
                    {
                        junc = junction[x].Replace("%1", UserName);
                        src = Path.Combine(ramDiskRoot, UserName, 
                            System.IO.Path.GetFileName(junc));

                        // create a directory on the RAMDISK - destination dir
                        Directory.CreateDirectory(src);
                        Console.WriteLine(junc + "<-->" + src);

                        // remove old junction if ramdisk root is not the same as last time
                        if (JunctionLord.Properties.Settings.Default.OldPath != ramDiskRoot && 
                            JunctionPoint.Exists(junc))
                            JunctionPoint.Delete(junc, false);

                        // To avoid senseless writing to the SSD, we should only change the
                        // source dir if we needs to
                        if (Directory.Exists(junc) && !JunctionPoint.Exists(junc))
                        {
                            try
                            {
                                DirectoryInfo juncdir = new DirectoryInfo(junc);
                                if (juncdir.GetDirectories("*", SearchOption.TopDirectoryOnly).Length > 0 ||
                                    juncdir.GetFiles("*").Length > 0)
                                {
                                    // Sometimes the source dir cant be deleted
                                    Directory.Delete(junc, true);
                                    Directory.CreateDirectory(junc);
                                }

                                if (!JunctionPoint.Exists(junc))
                                {
                                    JunctionPoint.Create(junc, src, true);
                                }
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e.Message);
                                bHasError = true;
                            }
                        }
                    }

                    // Replace old settings
                    if(JunctionLord.Properties.Settings.Default.OldPath != ramDiskRoot) 
                        JunctionLord.Properties.Settings.Default.OldPath = ramDiskRoot;

                }
                else
                {
                    Console.WriteLine("RAMDISK not found");
                    bHasError = true;
                }
            }
            else
            {
                Console.WriteLine("Junction List not found ... It should be in " + junctionListPath);
                bHasError = true;
            }

            if (bHasError)
            {
                Console.WriteLine("Press enter to continue...");
                Console.ReadLine();
            }

        }
    }
}


Oder hier Downloaden

 http://cid-fbf19bfeb328f9cb.office.live.com/embedicon.aspx/Sources/JunctionLord.zip

Advertisements
Kategorien:.NET, C# Schlagwörter: , ,