sketchucation logo sketchucation
    • 登入
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    ⚠️ Important | Libfredo 15.6b introduces important bugfixes for Fredo's Extensions Update

    Creation of folder from Ruby on Mac

    已排程 已置頂 已鎖定 已移動 Developers' Forum
    31 貼文 5 Posters 1.3k 瀏覽 5 Watching
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • jeff hammondJ 離線
      jeff hammond
      最後由 編輯

      yeah.. i don't know..

      the question by fredo is

      can you create a folder on mac via ruby or not?

      @fredo.. can you make a little script or snippet to test with?

      dotdotdot

      1 條回覆 最後回覆 回覆 引用 0
      • D 離線
        driven
        最後由 編輯

        @unknownuser said:

        can you create a folder on mac via ruby or not?

        Yes, using the ruby snippet in my last post [ saved as a .rb file ], I can create both a Folder and a file from a ruby script in the Plugins folder.

        @Jeff it should work on yours as well.

        @Fredo, is there any pattern to what's failing?

        john

        learn from the mistakes of others, you may not live long enough to make them all yourself...

        1 條回覆 最後回覆 回覆 引用 0
        • TIGT 離線
          TIG Moderator
          最後由 編輯

          I don't understand Fredo's issues here... 😕
          I already make/use different 'personal subfolders' on PC AND MAC to store temporary files, AND also permanent files: they are automatically made for each User in straightforward Ruby Code.
          I gave detailed examples in my earlier post - lifted almost verbatim from the SCF tools loader .rb, I just edited out some module specific Constants...
          The 'Plugin Store. for example has ..Local/Temp/SCF/ PC||MAC ...xxx/T/SCF/ folders to take the temporary RBZ files etc during auto-install processing and the ..Local/SCF/ PC||MAC ...xxx/SCF/ folders to take the 'encrypted login cookie' that's used so you don't have to login with every visit !

          TIG

          1 條回覆 最後回覆 回覆 引用 0
          • fredo6F 離線
            fredo6
            最後由 編輯

            All I am trying to figure out is an alternate location where to create the DEFPARAM_Dir folder, since for some Mac users, it seems not to work in the SU Plugins area on Mac.

            I was just wondering is the Mac has some sophisticated security whereby certain file operations are prohibited from scripts, even if you can perform them manually (like create a folder).

            If not, then we are left with the normal access rules and I imagine that the /users rootpath is normally enabled for writing.

            Fredo

            PS: thanks to the contributors. I have to ask as I don't have a Mac currently.

            1 條回覆 最後回覆 回覆 引用 0
            • D 離線
              driven
              最後由 編輯

              @fredo6 said:

              All I am trying to figure out is an alternate location where to create the DEFPARAM_Dir folder, since for some Mac users, it seems not to work in the SU Plugins area on Mac.

              Basically, if you can't write to there, it's hard to find somewhere else with 'lesser' permissions.
              I think it will work for more people where it is, as far as I can find, this should only be an issue on 'Guest Accounts' that have file access restrictions enabled by an administrator. [maybe Corporations/Uni's etc..]
              You can test for 'admin' quite easily [code below] and use a MB or similar for those without them...

              @unknownuser said:

              I was just wondering is the Mac has some sophisticated security whereby certain file operations are prohibited from scripts, even if you can perform them manually (like create a folder).

              It has lots, but for the majority of users, as long as it's in the 'User' domain it's actually a lot more complicated to limit access then allow it. App SandBoxing may come into play in a few cases.

              @unknownuser said:

              If not, then we are left with the normal access rules and I imagine that the /users rootpath is normally enabled for writing.

              I think you should go with that assumption, and maybe add some simple test to you logfile RE:admin

              always happy to help keep your plugins working on macs

              john

              This checks I'm an admin and writes to your folder from wherever I load your folder from.
              not the best coding, but works from a variety of accounts that I have access to.

              def isAdmin
                user = %x( whoami ).chomp!
                admins = %x( dscl . read /Groups/admin GroupMembership ).chomp!
                iSadmin = (admins.scan user) == user.to_a
              end
              
              begin
                home = (File.dirname(__FILE__))
                test_dir = home + "/DEFPARAM_Dir"
               if not FileTest.writable_real? test_dir
                UI.messagebox("You need an administrator to modify defaults!") if  not isAdmin
                else
                path = File.join( test_dir, "/from_v2013_plugins_file")
                file = File.open(path, "w")
                file.write( Time.now.to_s )
                end #if
              rescue
                #some error occur, dir not writable etc.
              ensure
                file.close unless file == nil
              end
              

              learn from the mistakes of others, you may not live long enough to make them all yourself...

              1 條回覆 最後回覆 回覆 引用 0
              • fredo6F 離線
                fredo6
                最後由 編輯

                @driven

                Thanks very much.
                Are you also able to create the directory, not just to write files?

                Fredo

                1 條回覆 最後回覆 回覆 引用 0
                • D 離線
                  driven
                  最後由 編輯

                  Yes

                  
                    Dir.mkdir(test_dir) unless FileTest.exists?(test_dir)
                  

                  works fine,
                  john

                  learn from the mistakes of others, you may not live long enough to make them all yourself...

                  1 條回覆 最後回覆 回覆 引用 0
                  • TIGT 離線
                    TIG Moderator
                    最後由 編輯

                    @driven said:

                    Yes

                    Dir.mkdir(test_dir) unless FileTest.exists?(test_dir)
                    

                    works fine,

                    john
                    That is the normal way to test if a folder/file exists and then if not you make it etc 😄 BUT I recommend an alternative...
                    On a PC with the current Ruby version operations like File.exist? etc can report 'false' even when it does exists, consequently causing an error when you try to make it and it's there ! - this occurs when the path contains non-ASCII characters - which is possible in user-names in the path to the Temp folder etc. I think MACs are more tolerant of characters? BUT we want a 'cross-platform' solution...
                    The simplest way is to always make it, trapping the error if it fails because it exists !

                    begin;Dir.mkdir(test_dir);rescue;p'Dir exists';end
                    

                    I just added the p 'puts' so you can see what happens in the RC...

                    TIG

                    1 條回覆 最後回覆 回覆 引用 0
                    • D 離線
                      driven
                      最後由 編輯

                      @TIG,
                      that works here as well, but it doesn't really tell you why it's failed.

                      can further checks be done in the 'rescue' to pin-point any issue
                      e.g

                        
                        UI.messagebox("Houston, we have a problem") if not FileTest.writable_real? test_dir
                        UI.messagebox("You are not an administrator on this computer") if  not isAdmin?
                      

                      which brings up a few questions, is there a PC equiv. for?

                      def isAdmin?
                        user = %x( whoami ).chomp!
                        admins = %x( dscl . read /Groups/admin GroupMembership ).chomp!
                        iSadmin = (admins.scan user)
                       iSadmin == user.to_a
                      end
                      

                      is FileTest.writable_real? any more reliable on a PC?

                      john

                      learn from the mistakes of others, you may not live long enough to make them all yourself...

                      1 條回覆 最後回覆 回覆 引用 0
                      • TIGT 離線
                        TIG Moderator
                        最後由 編輯

                        You normally won't need to know why it failed - of course you can puts the error message into the RC etc BUT why would a users temp folder tree limit writability anyway - it's where apps etc store their temp files ?
                        All my snippet was doing was avoiding the PC issue - where File.exist? returns 'false' when the file or folder actually exists, but there are non-ASCII characters in its path - like a 'usér-name'.
                        There's no other way of ensuring you 'make' the missing file / folder otherwise...
                        If File.exist? says 'false', BUT it really exists then Dir.mkdir will fail as you can't make a directory if it already exists, so isn't it best to always try and make it ?

                        TIG

                        1 條回覆 最後回覆 回覆 引用 0
                        • D 離線
                          driven
                          最後由 編輯

                          @tig said:

                          You normally won't need to know why it failed

                          I was thinking more for a standalone debug script to try and find why these edge cases are failing.

                          john

                          learn from the mistakes of others, you may not live long enough to make them all yourself...

                          1 條回覆 最後回覆 回覆 引用 0
                          • 1
                          • 2
                          • 2 / 2
                          • 第一個貼文
                            最後的貼文
                          Buy SketchPlus
                          Buy SUbD
                          Buy WrapR
                          Buy eBook
                          Buy Modelur
                          Buy Vertex Tools
                          Buy SketchCuisine
                          Buy FormFonts

                          Advertisement